diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs index 389d6f547d..bdf8e7bca3 100644 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using Xunit; @@ -10,10 +11,76 @@ namespace Microsoft.Framework.Primitives { public class StringValuesTests { - [Fact] - public void IsReadOnly_True() + public static TheoryData DefaultOrNullStringValues + { + get + { + return new TheoryData + { + new StringValues(), + new StringValues((string)null), + new StringValues((string[])null), + (string)null, + (string[])null + }; + } + } + + public static TheoryData EmptyStringValues + { + get + { + return new TheoryData + { + StringValues.Empty, + new StringValues(new string[0]), + new string[0] + }; + } + } + + public static TheoryData FilledStringValues + { + get + { + return new TheoryData + { + new StringValues("abc"), + new StringValues(new[] { "abc" }), + new StringValues(new[] { "abc", "bcd" }), + new StringValues(new[] { "abc", "bcd", "foo" }), + "abc", + new[] { "abc" }, + new[] { "abc", "bcd" }, + new[] { "abc", "bcd", "foo" } + }; + } + } + + public static TheoryData FilledStringValuesWithExpected + { + get + { + return new TheoryData + { + { new StringValues("abc"), new[] { "abc" } }, + { new StringValues(new[] { "abc" }), new[] { "abc" } }, + { new StringValues(new[] { "abc", "bcd" }), new[] { "abc", "bcd" } }, + { new StringValues(new[] { "abc", "bcd", "foo" }), new[] { "abc", "bcd", "foo" } }, + { "abc", new[] { "abc" } }, + { new[] { "abc" }, new[] { "abc" } }, + { new[] { "abc", "bcd" }, new[] { "abc", "bcd" } }, + { new[] { "abc", "bcd", "foo" }, new[] { "abc", "bcd", "foo" } } + }; + } + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + [MemberData(nameof(FilledStringValues))] + public void IsReadOnly_True(StringValues stringValues) { - var stringValues = new StringValues(); Assert.True(((IList)stringValues).IsReadOnly); Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); @@ -23,51 +90,34 @@ namespace Microsoft.Framework.Primitives Assert.Throws(() => ((ICollection)stringValues).Clear()); } - [Fact] - public void DefaultConstructor_ExpectedValues() + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + public void DefaultOrNull_ExpectedValues(StringValues stringValues) + { + Assert.Null((string[])stringValues); + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_ExpectedValues(StringValues stringValues) { - var stringValues = new StringValues(); Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); Assert.Equal((string)null, stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); Assert.Equal(new string[0], stringValues.ToArray()); Assert.True(StringValues.IsNullOrEmpty(stringValues)); Assert.Throws(() => stringValues[0]); + Assert.Throws(() => ((IList)stringValues)[0]); Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(null)); Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void Constructor_NullStringValue_ExpectedValues() - { - var stringValues = new StringValues((string)null); - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Null((string[])stringValues); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void Constructor_NullStringArray_ExpectedValues() - { - var stringValues = new StringValues((string[])null); - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Null((string[])stringValues); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(-1, ((IList)stringValues).IndexOf("not there")); + Assert.False(((ICollection)stringValues).Contains(null)); + Assert.False(((ICollection)stringValues).Contains(string.Empty)); + Assert.False(((ICollection)stringValues).Contains("not there")); Assert.Equal(0, stringValues.Count()); } @@ -85,6 +135,7 @@ namespace Microsoft.Framework.Primitives Assert.Equal(1, stringValues.Count); Assert.Equal(aString, stringValues); Assert.Equal(aString, stringValues[0]); + Assert.Equal(aString, ((IList)stringValues)[0]); Assert.Equal(new string[] { aString }, stringValues); } @@ -103,6 +154,7 @@ namespace Microsoft.Framework.Primitives Assert.Equal(1, stringValues.Count); Assert.Equal(aString, stringValues); Assert.Equal(aString, stringValues[0]); + Assert.Equal(aString, ((IList)stringValues)[0]); Assert.Equal(aStringArray, stringValues); aString = "abc"; @@ -113,5 +165,117 @@ namespace Microsoft.Framework.Primitives Assert.Equal("abc,bcd", stringValues); Assert.Equal(aStringArray, stringValues); } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) + { + var e1 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e1.Current); + Assert.False(e1.MoveNext()); + Assert.Null(e1.Current); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + + var e2 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e2.Current); + Assert.False(e2.MoveNext()); + Assert.Null(e2.Current); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Enumerator(StringValues stringValues, string[] expected) + { + var e1 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e1.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e1.MoveNext()); + Assert.Equal(expected[i], e1.Current); + } + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + + var e2 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e2.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e2.MoveNext()); + Assert.Equal(expected[i], e2.Current); + } + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void IndexOf(StringValues stringValues, string[] expected) + { + IList list = stringValues; + Assert.Equal(-1, list.IndexOf("not there")); + for (int i = 0; i < expected.Length; i++) + { + Assert.Equal(i, list.IndexOf(expected[i])); + } + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Contains(StringValues stringValues, string[] expected) + { + ICollection collection = stringValues; + Assert.False(collection.Contains("not there")); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(collection.Contains(expected[i])); + } + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void CopyTo(StringValues stringValues, string[] expected) + { + ICollection collection = stringValues; + string[] actual = new string[expected.Length]; + collection.CopyTo(actual, 0); + Assert.Equal(expected, actual); + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_Concat(StringValues stringValues) + { + string[] expected = new[] { "abc", "bcd", "foo" }; + Assert.Equal(expected, StringValues.Concat(stringValues, new StringValues(expected))); + Assert.Equal(expected, StringValues.Concat(new StringValues(expected), stringValues)); + + string[] empty = new string[0]; + Assert.Equal(empty, StringValues.Concat(stringValues, StringValues.Empty)); + Assert.Equal(empty, StringValues.Concat(StringValues.Empty, stringValues)); + Assert.Equal(empty, StringValues.Concat(stringValues, new StringValues())); + Assert.Equal(empty, StringValues.Concat(new StringValues(), stringValues)); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Concat(StringValues stringValues, string[] array) + { + string[] filled = new[] { "abc", "bcd", "foo" }; + + string[] expectedPrepended = array.Concat(filled).ToArray(); + Assert.Equal(expectedPrepended, StringValues.Concat(stringValues, new StringValues(filled))); + + string[] expectedAppended = filled.Concat(array).ToArray(); + Assert.Equal(expectedAppended, StringValues.Concat(new StringValues(filled), stringValues)); + } } }