[longomatch] Fix PlaysFilter and add unit tests



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]