[longomatch] Fix PlaysFilter and add unit tests
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] Fix PlaysFilter and add unit tests
- Date: Wed, 9 Jul 2014 09:56:09 +0000 (UTC)
commit 466373c15ab3c838fe6ea82432cdb6185bc19870
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date: Tue Jul 8 18:28:40 2014 +0200
Fix PlaysFilter and add unit tests
Disable filtering with the new API until the UI
is changed too
LongoMatch.Core/Common/PlaysFilter.cs | 161 +++++++++-------
.../Gui/Component/PlaysSelectionWidget.cs | 2 -
.../Gui/Component/Stats/PlayersViewer.cs | 9 -
.../Gui/TreeView/PlayersFilterTreeView.cs | 12 +-
LongoMatch.GUI/gtk-gui/gui.stetic | 1 -
Tests/Core/TestPlaysFilter.cs | 202 ++++++++++++++++++++
Tests/Tests.mdp | 1 +
7 files changed, 296 insertions(+), 92 deletions(-)
---
diff --git a/LongoMatch.Core/Common/PlaysFilter.cs b/LongoMatch.Core/Common/PlaysFilter.cs
index a58d84f..8444ded 100644
--- a/LongoMatch.Core/Common/PlaysFilter.cs
+++ b/LongoMatch.Core/Common/PlaysFilter.cs
@@ -31,13 +31,9 @@ namespace LongoMatch.Common
public event FilterUpdatedHandler FilterUpdated;
- bool playersFiltered, categoriesFiltered;
Dictionary<Category, List<Tag>> categoriesFilter;
List<Player> playersFilter;
Project project;
- List<Category> visibleCategories;
- List<Play> visiblePlays;
- List<Player> visiblePlayers;
public PlaysFilter (Project project)
{
@@ -48,80 +44,94 @@ namespace LongoMatch.Common
UpdateFilters();
}
- public bool PlayersFilterEnabled {
- get {
- return playersFiltered;
- }
- set {
- playersFiltered = value;
- Update();
- }
+ public List<Category> VisibleCategories {
+ get;
+ protected set;
}
- public bool CategoriesFilterEnabled {
- get {
- return categoriesFiltered;
- }
- set {
- categoriesFiltered = value;
- Update();
- }
+ public List<Player> VisiblePlayers {
+ get;
+ protected set;
}
- public void Update () {
- UpdateFilters();
- EmitFilterUpdated();
+ public List<Play> VisiblePlays {
+ get;
+ protected set;
}
- public void ClearCategoriesFilter () {
+ public void ClearCategoriesFilter (bool update=true) {
categoriesFilter.Clear();
- foreach (Category cat in project.Categories.List) {
- }
+ if (update)
+ Update ();
}
- public void ClearPlayersFilter () {
+ public void ClearPlayersFilter (bool update=true) {
playersFilter.Clear();
- foreach (var player in project.LocalTeamTemplate.List)
- playersFilter.Add(player);
- foreach (var player in project.VisitorTeamTemplate.List)
- playersFilter.Add(player);
+ if (update)
+ Update ();
}
- public void ClearAll () {
- ClearCategoriesFilter();
- ClearPlayersFilter();
+ public void ClearAll (bool update=true) {
+ ClearCategoriesFilter(false);
+ ClearPlayersFilter(false);
+ if (update)
+ Update ();
}
- public void FilterPlayer (Player player) {
- playersFilter.Remove(player);
- }
-
- public void UnFilterPlayer(Player player) {
- if (!playersFilter.Contains(player))
- playersFilter.Add(player);
+ public void FilterPlayer (Player player, bool visible) {
+ if (visible) {
+ if (!playersFilter.Contains(player))
+ playersFilter.Add(player);
+ } else {
+ if (playersFilter.Contains(player))
+ playersFilter.Remove(player);
+ }
+ Update();
}
- public List<Category> VisibleCategories {
- get {
- return visibleCategories;
+ public void FilterCategory (Category cat, bool visible) {
+ if (visible) {
+ if (!categoriesFilter.ContainsKey (cat))
+ categoriesFilter[cat] = new List<Tag> ();
+ } else {
+ if (categoriesFilter.ContainsKey (cat))
+ categoriesFilter.Remove (cat);
}
+ Update();
}
-
- public List<Player> VisiblePlayers {
- get {
- return visiblePlayers;
+
+ public void FilterCategoryTag (Category cat, Tag tag, bool visible) {
+ List<Tag> tags;
+
+ if (visible) {
+ FilterCategory (cat, true);
+ tags = categoriesFilter[cat];
+ if (!tags.Contains (tag))
+ tags.Add (tag);
+ } else {
+ if (categoriesFilter.ContainsKey(cat)) {
+ tags = categoriesFilter[cat];
+ if (tags.Contains (tag))
+ tags.Remove (tag);
+ }
}
+ Update();
}
public bool IsVisible(object o) {
if (o is Player) {
- return visiblePlayers.Contains(o as Player);
+ return VisiblePlayers.Contains(o as Player);
} else if (o is Play) {
- return visiblePlays.Contains (o as Play);
+ return VisiblePlays.Contains (o as Play);
}
return true;
}
+ public void Update () {
+ UpdateFilters();
+ EmitFilterUpdated();
+ }
+
void UpdateFilters () {
UpdateVisiblePlayers ();
UpdateVisibleCategories ();
@@ -129,44 +139,47 @@ namespace LongoMatch.Common
}
void UpdateVisiblePlayers () {
- visiblePlayers = new List<Player>();
- foreach (Player p in project.LocalTeamTemplate.List.Concat
(project.VisitorTeamTemplate.List)) {
- if (PlayersFilterEnabled && ! playersFilter.Contains (p)) {
- continue;
- }
- visiblePlayers.Add (p);
+ if (playersFilter.Count == 0) {
+ VisiblePlayers = project.LocalTeamTemplate.List.Concat
(project.VisitorTeamTemplate.List).ToList();
+ } else {
+ VisiblePlayers = playersFilter.ToList();
}
}
void UpdateVisibleCategories () {
- visibleCategories = new List<Category>();
- foreach (var c in categoriesFilter.Keys) {
- bool visible = false;
- if (!CategoriesFilterEnabled) {
- visible = true;
- } else {
- foreach (var subcat in categoriesFilter[c]) {
- }
- }
- if (visible)
- visibleCategories.Add (c);
+ if (categoriesFilter.Count == 0) {
+ VisibleCategories = project.Categories.List.ToList();
+ } else {
+ VisibleCategories = categoriesFilter.Keys.ToList();
}
}
void UpdateVisiblePlays () {
bool cat_match=true, player_match=true;
- visiblePlays = new List<Play>();
+ VisiblePlays = new List<Play>();
foreach (Play play in project.Timeline) {
- if (CategoriesFilterEnabled) {
- cat_match = false;
+ cat_match = false;
+ if (VisibleCategories.Contains (play.Category)) {
+ cat_match = true;
+ if (categoriesFilter.ContainsKey (play.Category)) {
+ List<Tag> tags = categoriesFilter[play.Category];
+ if (tags.Count == 0 || tags.Intersect (play.Tags).Count() >
0) {
+ cat_match = true;
+ } else {
+ cat_match = false;
+ }
+ }
}
-
- if (PlayersFilterEnabled)
+
+ if (play.Players.Count == 0 && VisiblePlayers.Count ==
+ project.LocalTeamTemplate.List.Count +
project.VisitorTeamTemplate.List.Count) {
+ player_match = true;
+ } else {
player_match = VisiblePlayers.Intersect(play.Players).Count() != 0;
-
+ }
if (player_match && cat_match) {
- visiblePlays.Add (play);
+ VisiblePlays.Add (play);
}
}
}
diff --git a/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
b/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
index 0b3b88f..b4ade9a 100644
--- a/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
+++ b/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
@@ -122,7 +122,6 @@ namespace LongoMatch.Gui.Component
} else {
catfiltersbutton.Label = Catalog.GetString("Enable categories filters");
}
- filter.CategoriesFilterEnabled = catfiltersbutton.Active;
}
protected void OnPlayersFiltersbuttonClicked (object sender, System.EventArgs e)
@@ -132,7 +131,6 @@ namespace LongoMatch.Gui.Component
} else {
playersfiltersbutton.Label = Catalog.GetString("Enable players filters");
}
- filter.PlayersFilterEnabled = playersfiltersbutton.Active;
}
}
}
diff --git a/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
b/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
index 4c2dcdd..e2de753 100644
--- a/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
+++ b/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
@@ -52,7 +52,6 @@ namespace LongoMatch.Gui.Component.Stats
store.Clear();
pstats = stats;
filter = new PlaysFilter (project);
- filter.PlayersFilterEnabled = true;
pstats.Filter = filter;
categoriesviewer.LoadStats (pstats, project);
AddTeam (project.LocalTeamTemplate, project.Categories);
@@ -66,23 +65,15 @@ namespace LongoMatch.Gui.Component.Stats
TreeIter teamIter;
teamIter = store.AppendValues (tpl.TeamName, null);
- foreach (Player p in tpl.List) {
- store.AppendValues (teamIter, p.Name, p);
- filter.FilterPlayer (p);
- }
}
void HandleCursorChanged (object sender, EventArgs e)
{
TreeIter iter;
- if (current != null)
- filter.FilterPlayer (current);
-
treeview1.Selection.GetSelected(out iter);
current = store.GetValue(iter, 1) as Player;
if (current != null) {
- filter.UnFilterPlayer (current);
filter.Update();
pstats.UpdateStats ();
categoriesviewer.ReloadStats ();
diff --git a/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
b/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
index c3fc78b..0d5df5a 100644
--- a/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
+++ b/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
@@ -80,19 +80,19 @@ namespace LongoMatch.Gui.Component
while (store.IterIsValid(child)) {
Player childPlayer = (Player) store.GetValue(child, 0);
- if (active)
- filter.UnFilterPlayer(childPlayer);
- else
- filter.FilterPlayer(childPlayer);
+// if (active)
+// filter.UnFilterPlayer(childPlayer);
+// else
+// filter.FilterPlayer(childPlayer);
store.SetValue(child, 1, active);
store.IterNext(ref child);
}
} else {
if (active) {
- filter.UnFilterPlayer(player);
+ //filter.UnFilterPlayer(player);
} else {
TreeIter team;
- filter.FilterPlayer(player);
+ //filter.FilterPlayer(player);
/* Uncheck the team check button */
if (local.List.Contains(player))
team = localIter;
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index 3295274..007c139 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -5087,7 +5087,6 @@ You can continue with the current capture, cancel it or save your project.
<property name="MemberName" />
<property name="CanFocus">True</property>
<property name="Label" translatable="yes">Histogram</property>
- <property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
diff --git a/Tests/Core/TestPlaysFilter.cs b/Tests/Core/TestPlaysFilter.cs
new file mode 100644
index 0000000..61bfb1c
--- /dev/null
+++ b/Tests/Core/TestPlaysFilter.cs
@@ -0,0 +1,202 @@
+//
+// Copyright (C) 2014 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using NUnit.Framework;
+using System;
+using LongoMatch.Store;
+using LongoMatch.Store.Templates;
+using LongoMatch.Common;
+
+namespace Tests.Core
+{
+ [TestFixture()]
+ public class TestPlaysFilter
+ {
+
+ Project CreateProject () {
+ Play pl;
+ Project p = new Project ();
+ p.Categories = Categories.DefaultTemplate (10);
+ p.LocalTeamTemplate = TeamTemplate.DefaultTemplate (5);
+ p.VisitorTeamTemplate = TeamTemplate.DefaultTemplate (5);
+ MediaFile mf = new MediaFile ("path", 34000, 25, true, true, "mp4", "h264",
+ "aac", 320, 240, 1.3, new Image (null));
+ ProjectDescription pd = new ProjectDescription ();
+ pd.File = mf;
+ p.Description = pd;
+
+ /* No tags, no players */
+ pl = new Play {Category = p.Categories.List[0]};
+ p.Timeline.Add (pl);
+ /* tags, but no players */
+ pl = new Play {Category = p.Categories.List[1]};
+ pl.Tags.Add (p.Categories.List[1].Tags[0]);
+ p.Timeline.Add (pl);
+ /* tags and players */
+ pl = new Play {Category = p.Categories.List[2]};
+ pl.Tags.Add (p.Categories.List[2].Tags[1]);
+ pl.Players.Add (p.LocalTeamTemplate.List[0]);
+ p.Timeline.Add (pl);
+ return p;
+ }
+
+ [Test()]
+ public void TestEmptyFilter ()
+ {
+ Project p = CreateProject ();
+ PlaysFilter filter = new PlaysFilter (p);
+
+ Assert.AreEqual (10, filter.VisibleCategories.Count);
+ Assert.AreEqual (10, filter.VisiblePlayers.Count);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ }
+
+ [Test()]
+ public void TestFilterCategory ()
+ {
+ Project p = CreateProject ();
+ PlaysFilter filter = new PlaysFilter (p);
+
+ filter.FilterCategory (p.Categories.List[0], true);
+ Assert.AreEqual (1, filter.VisibleCategories.Count);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+
+ filter.FilterCategory (p.Categories.List[1], true);
+ Assert.AreEqual (2, filter.VisibleCategories.Count);
+ Assert.AreEqual (2, filter.VisiblePlays.Count);
+
+ filter.FilterCategory (p.Categories.List[2], true);
+ Assert.AreEqual (3, filter.VisibleCategories.Count);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+
+ filter.FilterCategory (p.Categories.List[0], true);
+ Assert.AreEqual (3, filter.VisibleCategories.Count);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+
+ filter.FilterCategory (p.Categories.List[0], false);
+ Assert.AreEqual (2, filter.VisibleCategories.Count);
+ Assert.AreEqual (2, filter.VisiblePlays.Count);
+
+ filter.FilterCategory (p.Categories.List[1], false);
+ Assert.AreEqual (1, filter.VisibleCategories.Count);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+
+ filter.FilterCategory (p.Categories.List[2], false);
+ Assert.AreEqual (10, filter.VisibleCategories.Count);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ }
+
+ [Test()]
+ public void TestFilterCategoryTags ()
+ {
+ Project p = CreateProject ();
+ PlaysFilter filter = new PlaysFilter (p);
+
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[0], p.Categories.List[0].Tags[0], true);
+ Assert.AreEqual (1, filter.VisibleCategories.Count);
+ Assert.AreEqual (0, filter.VisiblePlays.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[1], p.Categories.List[1].Tags[0], true);
+ Assert.AreEqual (2, filter.VisibleCategories.Count);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[2], p.Categories.List[2].Tags[0], true);
+ Assert.AreEqual (3, filter.VisibleCategories.Count);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[2], p.Categories.List[2].Tags[1], true);
+ Assert.AreEqual (2, filter.VisiblePlays.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[0], p.Categories.List[0].Tags[0], false);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[1], p.Categories.List[1].Tags[0], false);
+ filter.FilterCategoryTag (p.Categories.List[1], p.Categories.List[1].Tags[1], true);
+ Assert.AreEqual (2, filter.VisiblePlays.Count);
+ Assert.AreEqual (p.Timeline[0], filter.VisiblePlays[0]);
+ Assert.AreEqual (p.Timeline[2], filter.VisiblePlays[1]);
+
+ /* One tag filtered now, but not the one of this play */
+ filter.FilterCategoryTag (p.Categories.List[2], p.Categories.List[2].Tags[1], false);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+ Assert.AreEqual (p.Timeline[0], filter.VisiblePlays[0]);
+ /* No more tags filtered, if the category matches we are ok */
+ filter.FilterCategoryTag (p.Categories.List[2], p.Categories.List[2].Tags[0], false);
+ Assert.AreEqual (2, filter.VisiblePlays.Count);
+ Assert.AreEqual (p.Timeline[0], filter.VisiblePlays[0]);
+ Assert.AreEqual (p.Timeline[2], filter.VisiblePlays[1]);
+
+ filter.ClearCategoriesFilter ();
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ }
+
+ [Test()]
+ public void TestFilterPlayers ()
+ {
+ Project p = CreateProject ();
+ PlaysFilter filter = new PlaysFilter (p);
+
+ Assert.AreEqual (10, filter.VisiblePlayers.Count);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ filter.FilterPlayer (p.LocalTeamTemplate.List[4], true);
+ Assert.AreEqual (0, filter.VisiblePlays.Count);
+ Assert.AreEqual (1, filter.VisiblePlayers.Count);
+ filter.FilterPlayer (p.LocalTeamTemplate.List[0], true);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+ Assert.AreEqual (2, filter.VisiblePlayers.Count);
+ filter.FilterPlayer (p.LocalTeamTemplate.List[0], true);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+ Assert.AreEqual (2, filter.VisiblePlayers.Count);
+ filter.FilterPlayer (p.LocalTeamTemplate.List[0], false);
+ Assert.AreEqual (0, filter.VisiblePlays.Count);
+ Assert.AreEqual (1, filter.VisiblePlayers.Count);
+ filter.FilterPlayer (p.LocalTeamTemplate.List[4], false);
+ Assert.AreEqual (10, filter.VisiblePlayers.Count);
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ }
+
+ [Test()]
+ public void TestClearFilters ()
+ {
+ Project p = CreateProject ();
+ PlaysFilter filter = new PlaysFilter (p);
+
+ filter.FilterPlayer (p.LocalTeamTemplate.List[0], true);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+ Assert.AreEqual (1, filter.VisiblePlayers.Count);
+ filter.ClearPlayersFilter();
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ Assert.AreEqual (10, filter.VisiblePlayers.Count);
+
+ filter.FilterCategory (p.Categories.List[0], true);
+ Assert.AreEqual (1, filter.VisiblePlays.Count);
+ Assert.AreEqual (1, filter.VisibleCategories.Count);
+ filter.ClearCategoriesFilter ();
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ Assert.AreEqual (10, filter.VisibleCategories.Count);
+
+ filter.FilterCategoryTag (p.Categories.List[0], p.Categories.List[0].Tags[0], true);
+ Assert.AreEqual (0, filter.VisiblePlays.Count);
+ Assert.AreEqual (1, filter.VisibleCategories.Count);
+ filter.ClearAll ();
+ Assert.AreEqual (3, filter.VisiblePlays.Count);
+ Assert.AreEqual (10, filter.VisibleCategories.Count);
+ }
+ }
+}
diff --git a/Tests/Tests.mdp b/Tests/Tests.mdp
index dd349bb..271eb98 100644
--- a/Tests/Tests.mdp
+++ b/Tests/Tests.mdp
@@ -44,6 +44,7 @@
<File subtype="Code" buildaction="Compile" name="Core/TestColor.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestTime.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestImage.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/TestPlaysFilter.cs" />
</Contents>
<References>
<ProjectReference type="Package" localcopy="False" refto="nunit.core, Version=2.6.0.0, Culture=neutral,
PublicKeyToken=96d09a1eb7f44a77" />
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]