Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit e6aaba3

Browse files
authored
Add Grouping class from Refractored.MvvmHelpers (#957)
1 parent dfa389d commit e6aaba3

File tree

4 files changed

+160
-25
lines changed

4 files changed

+160
-25
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System.Linq;
2+
using Xamarin.CommunityToolkit.ObjectModel;
3+
using Xunit;
4+
5+
namespace Xamarin.CommunityToolkit.UnitTests.ObjectModel
6+
{
7+
public sealed class Grouping_Tests
8+
{
9+
readonly Person[] people;
10+
11+
public Grouping_Tests()
12+
{
13+
people = new[]
14+
{
15+
new Person { FirstName = "Joseph", LastName = "Hill" },
16+
new Person { FirstName = "James", LastName = "Montemagno" },
17+
new Person { FirstName = "Pierce", LastName = "Boggan" },
18+
};
19+
}
20+
21+
[Fact]
22+
public void Grouping()
23+
{
24+
var sorted = from person in people
25+
orderby person.FirstName
26+
group person by person.Group
27+
into personGroup
28+
select new Grouping<string, Person>(personGroup.Key, personGroup);
29+
var grouped = new ObservableRangeCollection<Grouping<string, Person>>();
30+
grouped.AddRange(sorted);
31+
32+
Assert.Equal(2, grouped.Count);
33+
Assert.Equal("J", grouped[0].Key);
34+
Assert.Equal(2, grouped[0].Count);
35+
Assert.Single(grouped[1]);
36+
Assert.Equal(2, grouped[0].Items.Count);
37+
Assert.Single(grouped[1].Items);
38+
}
39+
40+
[Fact]
41+
public void GroupingSubKey()
42+
{
43+
var sorted = from person in people
44+
orderby person.FirstName
45+
group person by person.Group
46+
into personGroup
47+
select new Grouping<string, string, Person>(personGroup.Key, personGroup.Key, personGroup);
48+
var grouped = new ObservableRangeCollection<Grouping<string, string, Person>>();
49+
grouped.AddRange(sorted);
50+
51+
Assert.Equal(2, grouped.Count);
52+
Assert.Equal("J", grouped[0].SubKey);
53+
Assert.Equal("J", grouped[0].Key);
54+
Assert.Equal(2, grouped[0].Count);
55+
Assert.Single(grouped[1]);
56+
Assert.Equal(2, grouped[0].Items.Count);
57+
Assert.Single(grouped[1].Items);
58+
}
59+
}
60+
}

src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableObject_Tests.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.ComponentModel;
33
using System.Threading.Tasks;
4-
using Xamarin.CommunityToolkit.ObjectModel;
54
using Xunit;
65

76
namespace Xamarin.CommunityToolkit.UnitTests.ObjectModel
@@ -126,29 +125,5 @@ public async Task ValidateEventException()
126125

127126
Assert.NotNull(result);
128127
}
129-
130-
public class Person : ObservableObject
131-
{
132-
string firstName;
133-
string lastName;
134-
135-
public Action Changed { get; set; }
136-
137-
public Action Changing { get; set; }
138-
139-
public Func<string, string, bool> Validate { get; set; }
140-
141-
public string FirstName
142-
{
143-
get => firstName;
144-
set => SetProperty(ref firstName, value, onChanged: Changed, onChanging: Changing, validateValue: Validate);
145-
}
146-
147-
public string LastName
148-
{
149-
get => lastName;
150-
set => SetProperty(ref lastName, value, onChanged: Changed, onChanging: Changing, validateValue: Validate);
151-
}
152-
}
153128
}
154129
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using Xamarin.CommunityToolkit.ObjectModel;
3+
4+
namespace Xamarin.CommunityToolkit.UnitTests.ObjectModel
5+
{
6+
class Person : ObservableObject
7+
{
8+
string firstName;
9+
string lastName;
10+
11+
public Action Changed { get; set; }
12+
13+
public Action Changing { get; set; }
14+
15+
public Func<string, string, bool> Validate { get; set; }
16+
17+
public string FirstName
18+
{
19+
get => firstName;
20+
set => SetProperty(ref firstName, value, onChanged: Changed, onChanging: Changing, validateValue: Validate);
21+
}
22+
23+
public string LastName
24+
{
25+
get => lastName;
26+
set => SetProperty(ref lastName, value, onChanged: Changed, onChanging: Changing, validateValue: Validate);
27+
}
28+
29+
public string Group => FirstName[0].ToString().ToUpperInvariant();
30+
}
31+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System.Collections.Generic;
2+
3+
#nullable enable
4+
5+
namespace Xamarin.CommunityToolkit.ObjectModel
6+
{
7+
/// <summary>
8+
/// Grouping of items by key into ObservableRange
9+
/// </summary>
10+
public class Grouping<TKey, TItem> : ObservableRangeCollection<TItem>
11+
{
12+
/// <summary>
13+
/// Gets the key.
14+
/// </summary>
15+
/// <value>The key.</value>
16+
public TKey Key { get; }
17+
18+
/// <summary>
19+
/// Returns list of items in the grouping.
20+
/// </summary>
21+
public new IList<TItem> Items => base.Items;
22+
23+
/// <summary>
24+
/// Initializes a new instance of the Grouping class.
25+
/// </summary>
26+
/// <param name="key">Key.</param>
27+
/// <param name="items">Items.</param>
28+
public Grouping(TKey key, IEnumerable<TItem> items)
29+
{
30+
Key = key;
31+
AddRange(items);
32+
}
33+
}
34+
35+
/// <summary>
36+
/// Grouping of items by key and subkey into ObservableRange
37+
/// </summary>
38+
public class Grouping<TKey, TSubKey, TItem> : ObservableRangeCollection<TItem>
39+
{
40+
/// <summary>
41+
/// Gets the key.
42+
/// </summary>
43+
/// <value>The key.</value>
44+
public TKey Key { get; }
45+
46+
/// <summary>
47+
/// Gets the subkey of the grouping
48+
/// </summary>
49+
public TSubKey SubKey { get; }
50+
51+
/// <summary>
52+
/// Returns list of items in the grouping.
53+
/// </summary>
54+
public new IList<TItem> Items => base.Items;
55+
56+
/// <summary>
57+
/// Initializes a new instance of the Grouping class.
58+
/// </summary>
59+
/// <param name="key">Key.</param>
60+
/// <param name="subkey">Subkey</param>
61+
/// <param name="items">Items.</param>
62+
public Grouping(TKey key, TSubKey subkey, IEnumerable<TItem> items)
63+
{
64+
Key = key;
65+
SubKey = subkey;
66+
AddRange(items);
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)