public void Words_contains_the_same_elements_as_the_given_list()
        {
            var words = TestData.CreateListOfWordsEnumerable(20).ToList();

            var sut = WordChain.New(words, TimeSpan.Zero);

            Assert.Equal(words.Count, sut.Words.Count());
            Assert.All(sut.Words, word => Assert.Contains(word, words));
        }
 public void New_produces_an_object_that_is_of_type_IWordChain()
 => Xssert
 .TheActualType(actualTypeSelector: () =>
                WordChain.New(
                    words: TestData.CreateListOfWordsEnumerable(2),
                    duration: TimeSpan.Zero
                    )
                )
 .IsDerivedFromTheExpectedType <IWordChain>()
 ;
 public void Throws_ArgumentOutOfRangeException_when_words_parameter_holds_less_than_two_words(int amountOfWords)
 => Xssert.ThrowsArgumentOutOfRangeException(
     testCode: () =>
 {
     var words = TestData.CreateListOfWordsEnumerable(amountOfWords);
     WordChain.New(words: words, duration: TimeSpan.Zero);
 },
     expectedParameterName: "words",
     expectedMessageContains: $"The parameter 'words' should at least contain 2 words, in stead of the provided amount of '{amountOfWords}' words."
     )
 ;
        public static IEnumerable <object[]> Duration_is_calulcated_accordingly_for_a_given_IWordChain_collection_TestData()
        => new List <object[]>
        {
            new object[]
            {
                new List <IWordChain>
                {
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(1))
                },
                TimeSpan.FromSeconds(1)
            },

            new object[]
            {
                new List <IWordChain>
                {
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(1)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(5)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromMinutes(1))
                },
                new TimeSpan(hours: 0, minutes: 1, seconds: 6),
            },

            new object[]
            {
                new List <IWordChain>
                {
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromMilliseconds(505)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(5)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromMinutes(3))
                },
                new TimeSpan(hours: 0, minutes: 3, seconds: 5).Add(TimeSpan.FromMilliseconds(505)),
            }
        }

        ;
        public static IEnumerable <object[]> IWordChain_collections_are_equivalent_as_those_that_where_passed_TestData()
        => new List <object[]>
        {
            new object[]
            {
                new List <IWordChain>
                {
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(1))
                },
                1
            },

            new object[]
            {
                new List <IWordChain>
                {
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(1)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(5)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromMinutes(1))
                },
                3
            },

            new object[]
            {
                new List <IWordChain>
                {
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromMilliseconds(505)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromSeconds(5)),
                    WordChain.New(TestData.CreateListOfWordsEnumerable(10), TimeSpan.FromMinutes(3))
                },
                3
            }
        }

        ;
 public void Length_reflects_the_number_of_words_in_the_chain(int amountOfWords)
 => Assert.Equal(amountOfWords, WordChain.New(TestData.CreateListOfWordsEnumerable(amountOfWords), TimeSpan.Zero).Length);
 public void EndingWord_is_the_same_as_the_last_word_in_the_given_list()
 => Assert.Equal("word20", WordChain.New(TestData.CreateListOfWordsEnumerable(20), TimeSpan.Zero).EndingWord);
 public void Throws_ArgumentNullException_when_words_parameter_is_null()
 => Xssert.ThrowsArgumentNullException(
     testCode: () => WordChain.New(words: null, duration: TimeSpan.Zero),
     expectedParameterName: "words"
     )
 ;