public async Task Should_write_JSON_array_with_correct_elements()
        {
            // Arrange
            var faker = new Faker();

            var elements = faker.Random.WordsArray(10);

            var asyncEnumerableElements = new AsyncEnumerableList <string>();

            asyncEnumerableElements.AddRange(elements);

            var expected = JsonConvert.SerializeObject(elements);

            var sut = new ConverterImplementation <string>(typeof(AsyncEnumerableList <string>));

            // Act
            var buffer = new StringWriter();

            await sut.WriteJsonAsync(new JsonTextWriter(buffer), asyncEnumerableElements);

            var actual = buffer.ToString();

            // Assert
            actual.Should().Be(expected);
        }
        public void Should_read_JSON_array_into_constructor_using_IEnumerable_or_IAsyncEnumerable(Type collectionType)
        {
            // Arrange
            var faker = new Faker();

            var elements = faker.Random.WordsArray(10);

            var serializer = new JsonSerializer();

            var jsonBuffer = new StringWriter();

            serializer.Serialize(new JsonTextWriter(jsonBuffer), elements);

            var json = jsonBuffer.ToString();

            var sut = new ConverterImplementation <string>(collectionType);

            var reader = new JsonTextReader(new StringReader(json));

            reader.Read().Should().BeTrue();
            reader.TokenType.Should().Be(JsonToken.StartArray);

            // Act
            var result = sut.ConstructFromJson(reader, serializer);

            // Assert
            result.Should().BeOfType(collectionType);

            var resultList = ((TestCollectionTypes.ConstructWithIEnumerable)result).Data;

            resultList.Should().BeEquivalentTo(elements);
        }
        public void Should_detect_repeated_enumeration_when_reading_JSON_array_into_constructor_using_IEnumerable_or_IAsyncEnumerable(Type collectionType)
        {
            // Arrange
            var faker = new Faker();

            var elements = faker.Random.WordsArray(10);

            var serializer = new JsonSerializer();

            var jsonBuffer = new StringWriter();

            serializer.Serialize(new JsonTextWriter(jsonBuffer), elements);

            var json = jsonBuffer.ToString();

            var sut = new ConverterImplementation <string>(collectionType);

            var reader = new JsonTextReader(new StringReader(json));

            reader.Read().Should().BeTrue();
            reader.TokenType.Should().Be(JsonToken.StartArray);

            // Act & Assert
            Assert.Throws <JsonSerializationException>(
                () =>
            {
                sut.ConstructFromJson(reader, serializer);
            });
        }
        public void Should_read_JSON_array_into_existing_ICollection_object()
        {
            // Arrange
            var faker = new Faker();

            var elements = faker.Random.WordsArray(10);

            var serializer = new JsonSerializer();

            var jsonBuffer = new StringWriter();

            serializer.Serialize(new JsonTextWriter(jsonBuffer), elements);

            var json = jsonBuffer.ToString();

            var sut = new ConverterImplementation <string>(typeof(AsyncEnumerableList <string>));

            var reader = new JsonTextReader(new StringReader(json));

            reader.Read().Should().BeTrue();
            reader.TokenType.Should().Be(JsonToken.StartArray);

            var existingValue = new AsyncEnumerableList <string>();

            // Act
            var result = sut.ReadJson(reader, existingValue, serializer);

            // Assert
            result.Should().BeSameAs(existingValue);
            existingValue.Should().BeEquivalentTo(elements);
        }
        public void Should_determine_CanConstruct(bool expected, Type collectionType, string collectionTypeDescription)
        {
            // Arrange
            var sut = new ConverterImplementation <string>(collectionType);

            // Act
            var actual = sut.CanConstruct;

            // Assert
            actual.Should().Be(expected, $"CanRead should be {expected} for {collectionTypeDescription}");
        }