forked from reactiveui/ReactiveUI
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUtility.cs
More file actions
132 lines (115 loc) · 4.12 KB
/
Utility.cs
File metadata and controls
132 lines (115 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MS-PL license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Reactive.Concurrency;
using System.Linq;
using System.Globalization;
using System.Reflection;
using System.Threading;
using Xunit;
using Xunit.Sdk;
using System.Diagnostics;
namespace ReactiveUI.Tests
{
public static class EnumerableTestMixin
{
public static void AssertAreEqual<T>(this IEnumerable<T> lhs, IEnumerable<T> rhs)
{
var left = lhs.ToArray();
var right = rhs.ToArray();
try
{
Assert.Equal(left.Length, right.Length);
for (int i = 0; i < left.Length; i++)
{
Assert.Equal(left[i], right[i]);
}
}
catch
{
Debug.WriteLine("lhs: [{0}]", String.Join(",", lhs.ToArray()));
Debug.WriteLine("rhs: [{0}]", String.Join(",", rhs.ToArray()));
throw;
}
}
public static IEnumerable<T> DistinctUntilChanged<T>(this IEnumerable<T> This)
{
bool isFirst = true;
T lastValue = default(T);
foreach (var v in This)
{
if (isFirst)
{
lastValue = v;
isFirst = false;
yield return v;
continue;
}
if (!EqualityComparer<T>.Default.Equals(v, lastValue))
{
yield return v;
}
lastValue = v;
}
}
}
public class CountingTestScheduler : IScheduler
{
public CountingTestScheduler(IScheduler innerScheduler)
{
InnerScheduler = innerScheduler;
ScheduledItems = new List<Tuple<Action, TimeSpan?>>();
}
public IScheduler InnerScheduler { get; private set; }
public List<Tuple<Action, TimeSpan?>> ScheduledItems { get; private set; }
public DateTimeOffset Now
{
get { return InnerScheduler.Now; }
}
public IDisposable Schedule<TState>(TState state, DateTimeOffset dueTime, Func<IScheduler, TState, IDisposable> action)
{
ScheduledItems.Add(new Tuple<Action, TimeSpan?>(() => action(this, state), null));
return InnerScheduler.Schedule(state, dueTime, action);
}
public IDisposable Schedule<TState>(TState state, TimeSpan dueTime, Func<IScheduler, TState, IDisposable> action)
{
ScheduledItems.Add(new Tuple<Action, TimeSpan?>(() => action(this, state), dueTime));
return InnerScheduler.Schedule(state, dueTime, action);
}
public IDisposable Schedule<TState>(TState state, Func<IScheduler, TState, IDisposable> action)
{
ScheduledItems.Add(new Tuple<Action, TimeSpan?>(() => action(this, state), null));
return InnerScheduler.Schedule(state, action);
}
}
internal static class CompatMixins
{
public static void Run<T>(this IEnumerable<T> This, Action<T> block)
{
foreach (var v in This)
{
block(v);
}
}
public static IEnumerable<T> SkipLast<T>(this IEnumerable<T> This, int count)
{
return This.Take(This.Count() - count);
}
}
// run tests on invariant culture to avoid problems e.g with culture specific decimal separator
public class UseInvariantCulture : BeforeAfterTestAttribute
{
private CultureInfo storedCulture;
public override void Before(MethodInfo methodUnderTest)
{
storedCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
}
public override void After(MethodInfo methodUnderTest)
{
Thread.CurrentThread.CurrentCulture = storedCulture;
}
}
}