< Summary

Class:SearchHandler[T]
Assembly:BuilderProjectsPanel
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BuilderProjectsPanel/Scripts/SearchHandler/SearchHandler.cs
Covered lines:64
Uncovered lines:6
Coverable lines:70
Total lines:147
Line coverage:91.4% (64 of 70)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SearchHandler(...)0%330100%
SearchHandler()0%110100%
SetSearchableList(...)0%110100%
AddItem(...)0%440100%
RemoveItem(...)0%330100%
GetResult(...)0%14140100%
NotifySearchChanged(...)0%220100%
NotifySortTypeChanged(...)0%220100%
NotifySortOrderChanged(...)0%220100%
NotifyFilterChanged()0%110100%
Match(...)0%6200%
MatchSearch(...)0%110100%
MatchFilter(...)0%2.152066.67%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BuilderProjectsPanel/Scripts/SearchHandler/SearchHandler.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3
 4public class SearchHandler<T> where T : ISearchable, ISortable<T>
 5{
 6    public event Action<List<T>> OnSearchChanged;
 7
 08    public string[] sortingTypes { get; }
 319    public bool isDescendingSortOrder { get; private set; } = true;
 010    public string currentSearchString { get; private set; }
 011    public string currentSortingType { get; private set; }
 012    public int resultCount { get { return currentResult?.Count ?? 0; } }
 13
 14    private List<T> originalList;
 15    private List<T> searchResult;
 16    private List<T> currentResult;
 17
 18    private readonly Predicate<T> currentFilterPredicate;
 19
 20    private bool searchStringChanged = false;
 21    private bool searchSortChanged = false;
 22    private bool searchFilterChanged = false;
 23
 3124    public SearchHandler(string[] sortingTypes, Predicate<T> filterPredicate)
 25    {
 3126        this.sortingTypes = sortingTypes;
 3127        this.currentFilterPredicate = filterPredicate;
 3128        this.currentSortingType = sortingTypes?[0];
 3129    }
 30
 3431    public SearchHandler() : this(null, null) { }
 32
 33    public void SetSearchableList(List<T> list)
 34    {
 3035        originalList = list;
 3036        searchResult = list;
 3037        currentResult = list;
 38
 3039        searchStringChanged = true;
 3040        searchFilterChanged = true;
 3041        searchSortChanged = true;
 42
 3043        GetResult(OnSearchChanged);
 3044    }
 45
 46    public void AddItem(T item)
 47    {
 148        originalList.Add(item);
 149        bool matchSearch = MatchSearch(item);
 150        bool matchResult = matchSearch && MatchFilter(item);
 51
 152        if (matchSearch)
 53        {
 154            searchResult.Add(item);
 55        }
 56
 157        if (matchResult)
 58        {
 159            currentResult.Add(item);
 160            searchSortChanged = true;
 161            GetResult(OnSearchChanged);
 62        }
 163    }
 64
 65    public void RemoveItem(T item)
 66    {
 667        originalList.Remove(item);
 668        searchResult.Remove(item);
 669        bool inResult = currentResult.Remove(item);
 670        if (inResult)
 71        {
 672            OnSearchChanged?.Invoke(currentResult);
 73        }
 674    }
 75
 76    public void GetResult(Action<List<T>> onResult)
 77    {
 4178        if (originalList == null)
 79        {
 780            onResult?.Invoke(null);
 781            return;
 82        }
 83
 3484        if (searchStringChanged)
 85        {
 3186            searchResult = string.IsNullOrEmpty(currentSearchString) ? originalList : SearchHelper.Search(currentSearchS
 3187            currentResult = searchResult;
 88        }
 89
 3490        if (searchFilterChanged || searchStringChanged)
 91        {
 3292            currentResult = currentFilterPredicate != null
 93                ? SearchHelper.Filter(searchResult, currentFilterPredicate)
 94                : searchResult;
 95        }
 96
 3497        if ((searchSortChanged || searchStringChanged) && currentResult != null && currentSortingType != null)
 98        {
 2799            SearchHelper.Sort(currentSortingType, currentResult, isDescendingSortOrder);
 100        }
 101
 34102        searchStringChanged = false;
 34103        searchFilterChanged = false;
 34104        searchSortChanged = false;
 105
 34106        onResult?.Invoke(currentResult);
 34107    }
 108
 109    public void NotifySearchChanged(string searchText)
 110    {
 6111        searchStringChanged = searchStringChanged || searchText != currentSearchString;
 6112        currentSearchString = searchText;
 6113        GetResult(OnSearchChanged);
 6114    }
 115
 116    public void NotifySortTypeChanged(string sortingType)
 117    {
 2118        searchSortChanged = searchSortChanged || currentSortingType != sortingType;
 2119        currentSortingType = sortingType;
 2120        GetResult(OnSearchChanged);
 2121    }
 122
 123    public void NotifySortOrderChanged(bool isDescending)
 124    {
 1125        searchSortChanged = searchSortChanged || isDescendingSortOrder != isDescending;
 1126        isDescendingSortOrder = isDescending;
 1127        GetResult(OnSearchChanged);
 1128    }
 129
 130    public void NotifyFilterChanged()
 131    {
 1132        searchFilterChanged = true;
 1133        GetResult(OnSearchChanged);
 1134    }
 135
 0136    public bool Match(T item) { return MatchSearch(item) && MatchFilter(item); }
 137
 1138    private bool MatchSearch(T item) { return SearchHelper.SearchMatchItem(currentSearchString, item); }
 139
 140    private bool MatchFilter(T item)
 141    {
 1142        if (currentFilterPredicate == null)
 0143            return true;
 144
 1145        return currentFilterPredicate(item);
 146    }
 147}