public async Task AddMultipleNonUnique_GetByQuery_ContainsOnlyUnique(int tasksCount) { using var index = new StringIndex <string>(); var inputs = new Dictionary <string, IEnumerable <string> >(); for (var i = 0; i < tasksCount; i++) { var nonUnique = Guid.NewGuid().ToString(); inputs[Guid.NewGuid().ToString()] = new[] { nonUnique, nonUnique, nonUnique, nonUnique }; } var tasks = new List <Task>(); foreach (var(q, input) in inputs) { tasks.Add(Task.Run(() => index.Add(q, input.Take(2)))); tasks.Add(Task.Run(() => index.Add(q, input.Skip(2)))); } await Task.WhenAll(tasks); var getTasks = inputs.Keys.Select(q => Task.Run(() => new { Query = q, Result = index.Get(q) })).ToList(); await Task.WhenAll(getTasks); foreach (var task in getTasks) { var(query, result) = (task.Result.Query, task.Result.Result); var input = inputs[query].ToList(); Assert.All(input, x => Assert.Contains(x, result)); Assert.Equal(1, result.Count); Assert.NotEqual(input.Count, result.Count); Assert.Equal(new HashSet <string>(input), result); } }
public async Task OnAddEmpty_AddEventNotInvoked(int tasksCount) { using var index = new StringIndex <string>(); var inputs = new Dictionary <string, IEnumerable <string> >(); for (var i = 0; i < tasksCount; i++) { inputs[Guid.NewGuid().ToString()] = new string[0]; } var triggered = 0; index.Added += (q, values) => { var input = inputs[q]; Assert.Equal(input, values); Interlocked.Increment(ref triggered); }; var tasks = new List <Task>(); foreach (var(q, input) in inputs) { tasks.Add(Task.Run(() => index.Add(q, input))); } await Task.WhenAll(tasks); Assert.Equal(0, triggered); }
public async Task Flush_GetByQuery_ReturnsEmpty(int tasksCount) { using var index = new StringIndex <string>(); var inputs = new Dictionary <string, IEnumerable <string> >(); for (var i = 0; i < tasksCount; i++) { inputs[Guid.NewGuid().ToString()] = new [] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() } } ; var tasks = new List <Task>(); foreach (var(q, input) in inputs) { tasks.Add(Task.Run(() => index.Add(q, input))); } await Task.WhenAll(tasks); await Task.Run(() => index.Flush()); var getTasks = inputs.Keys.Select(x => Task.Run(() => index.Get(x))).ToList(); await Task.WhenAll(getTasks); foreach (var task in getTasks) { Assert.Empty(task.Result); } }
public async Task OnAdd_AddEventInvoked_ReturnedAddedValue(int tasksCount) { using var index = new StringIndex <string>(); var inputs = new Dictionary <string, string>(); for (var i = 0; i < tasksCount; i++) { inputs[Guid.NewGuid().ToString()] = Guid.NewGuid().ToString(); } var triggered = 0; index.Added += (q, values) => { var input = inputs[q]; Assert.Equal(new [] { input }, values); Interlocked.Increment(ref triggered); }; var tasks = new List <Task>(); foreach (var(q, input) in inputs) { tasks.Add(Task.Run(() => index.Add(q, input))); } await Task.WhenAll(tasks); Assert.Equal(tasksCount, triggered); }
public async Task AddMultipleUnique_GetByQuery_EqualsWithInput(int tasksCount) { using var index = new StringIndex <string>(); var inputs = new Dictionary <string, IEnumerable <string> >(); for (var i = 0; i < tasksCount; i++) { inputs[Guid.NewGuid().ToString()] = new [] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() } } ; var tasks = new List <Task>(); foreach (var(q, input) in inputs) { tasks.Add(Task.Run(() => index.Add(q, input))); } await Task.WhenAll(tasks); var getTasks = inputs.Keys.Select(q => Task.Run(() => new { Query = q, Result = index.Get(q) })).ToList(); await Task.WhenAll(getTasks); foreach (var task in getTasks) { var(query, result) = (task.Result.Query, task.Result.Result); var input = inputs[query]; Assert.All(input, x => Assert.Contains(x, result)); } }
public void AddNull_DoNothing() { using var index = new StringIndex <string>(); index.Add(null, new string[0]); var result = index.Get(null); Assert.Empty(result); }
public void Contains_ReturnIfContain() { var existed = "existed"; var notExisted = "notExisted"; using var index = new StringIndex <string>(); index.Add(existed, Guid.NewGuid().ToString()); Assert.True(index.Contains(existed)); Assert.False(index.Contains(notExisted)); }
public async Task RemoveMultiple_GetByQuery_NotContainsRemoved(int tasksCount) { var skipTake = 3; using var index = new StringIndex <string>(); var inputs = new Dictionary <string, IEnumerable <string> >(); for (var i = 0; i < tasksCount; i++) { inputs[Guid.NewGuid().ToString()] = new [] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() } } ; var tasks = new List <Task>(); foreach (var(q, input) in inputs) { tasks.Add(Task.Run(() => index.Add(q, input))); } await Task.WhenAll(tasks); var removeTasks = new List <Task>(); foreach (var(q, input) in inputs) { removeTasks.Add(Task.Run(() => index.Remove(q, input.Take(skipTake)))); } await Task.WhenAll(removeTasks); var getTasks = inputs.Keys.Select(q => Task.Run(() => new { Query = q, Result = index.Get(q) })).ToList(); await Task.WhenAll(getTasks); foreach (var task in getTasks) { var(query, result) = (task.Result.Query, task.Result.Result); var input = inputs[query].ToList(); Assert.All(input.Skip(skipTake), x => Assert.Contains(x, result)); Assert.All(input.Take(skipTake), x => Assert.DoesNotContain(x, result)); Assert.Equal(input.Count - skipTake, result.Count); } }
public void AddAndSearchValues() { var si = new StringIndex(); si.Add("abcdef", "1"); si.Add("abcdeff", "2"); si.Add("abcdeffg", "3"); si.Add("bcdef", "4"); si.Add("bcdefg", "5"); si.Add("cdefg", "6"); si.Add("cdefgh", "7"); var output = si.GetValuesByPrefixFlattened("abc"); Assert.IsTrue(output.Contains("1") && output.Contains("2") && output.Contains("3")); }
public void Clear() { var si = new StringIndex(); si.Add("abcdef", "1"); si.Add("abcdeff", "2"); si.Add("abcdeffg", "3"); si.Add("bcdef", "4"); si.Add("bcdefg", "5"); si.Add("cdefg", "6"); si.Add("cdefgh", "7"); si.Clear(); var output = si.GetValuesByPrefix("abc"); Assert.IsTrue(output.Count == 0); }
public void AddAndSearchValuesCount() { var si = new StringIndex(); si.Add("abcdef", "1"); si.Add("abcdeff", "2"); si.Add("abcdeffg", "3"); si.Add("bcdef", "4"); si.Add("bcdefg", "5"); si.Add("cdefg", "6"); si.Add("cdefgh", "7"); si.Remove("cdefgh", "7"); var output1 = si.GetValuesByPrefixCount("abc"); var output2 = si.GetValuesByPrefixCount("b"); var output3 = si.GetValuesByPrefixCount("bc"); var output4 = si.GetValuesByPrefixCount("ca"); Assert.IsTrue(output1 == 3 && output2 == 2 && output3 == 2 && output4 == 0); }
public async Task OnRemoveAll_RemoveEventInvoked_ReturnedRemovedValues(int tasksCount) { using var index = new StringIndex <string>(); var inputs = new Dictionary <string, IEnumerable <string> >(); for (var i = 0; i < tasksCount; i++) { inputs[Guid.NewGuid().ToString()] = new [] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() } } ; foreach (var(q, input) in inputs) { index.Add(q, input); } var triggered = 0; index.Removed += (q, values) => { var input = inputs[q]; Assert.All(input, x => Assert.Contains(x, values)); Interlocked.Increment(ref triggered); }; var tasks = new List <Task>(); foreach (var(q, _) in inputs) { tasks.Add(Task.Run(() => index.RemoveAll(q, out _))); } await Task.WhenAll(tasks); Assert.Equal(tasksCount, triggered); } }