Skip to content

Instantly share code, notes, and snippets.

@kentcb
Created July 18, 2016 07:54
Show Gist options
  • Save kentcb/36d3d9666f7c5d3c385256875df54387 to your computer and use it in GitHub Desktop.
Save kentcb/36d3d9666f7c5d3c385256875df54387 to your computer and use it in GitHub Desktop.
Repro of DynamicData sorting problem
public class ItemViewModel : ReactiveObject
{
private readonly string name;
private readonly ObservableAsPropertyHelper<int> sortOrder;
public ItemViewModel(string name, IObservable<int> sortOrder, IScheduler scheduler)
{
this.name = name;
this.sortOrder = sortOrder
.ToProperty(this, x => x.SortOrder, scheduler: scheduler);
}
public string Name => this.name;
public int SortOrder => this.sortOrder.Value;
}
public class ItemComparer : IComparer<ItemViewModel>
{
public static readonly ItemComparer Instance = new ItemComparer();
private ItemComparer()
{
}
public int Compare(ItemViewModel x, ItemViewModel y) =>
x.SortOrder.CompareTo(y.SortOrder);
}
public class ItemsViewModel : ReactiveObject
{
private readonly SourceList<ItemViewModel> items;
private ReadOnlyObservableCollection<ItemViewModel> sortedItems;
public ItemsViewModel()
{
this.items = new SourceList<ItemViewModel>();
var sortedItems = items
.Connect()
.Sort(ItemComparer.Instance)
.Bind(out this.sortedItems)
.Subscribe();
}
public ReadOnlyObservableCollection<ItemViewModel> SortedItems => this.sortedItems;
public void Add(ItemViewModel item) => this.items.Add(item);
}
public class Fixture
{
[Fact]
public void foo()
{
var scheduler = new TestScheduler();
var vm1SortOrder = new BehaviorSubject<int>(0);
var vm2SortOrder = new BehaviorSubject<int>(1);
var vm3SortOrder = new BehaviorSubject<int>(2);
var vm1 = new ItemViewModel("First", vm1SortOrder, scheduler);
var vm2 = new ItemViewModel("Second", vm2SortOrder, scheduler);
var vm3 = new ItemViewModel("Third", vm3SortOrder, scheduler);
var sut = new ItemsViewModel();
sut.Add(vm1);
sut.Add(vm2);
sut.Add(vm3);
scheduler.Start();
Assert.Equal(3, sut.SortedItems.Count);
Assert.Equal("First", sut.SortedItems[0].Name);
Assert.Equal("Second", sut.SortedItems[1].Name);
Assert.Equal("Third", sut.SortedItems[2].Name);
vm1SortOrder.OnNext(4);
Assert.Equal("Second", sut.SortedItems[0].Name);
Assert.Equal("Third", sut.SortedItems[1].Name);
Assert.Equal("First", sut.SortedItems[2].Name);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment