public void SelectCharacterEncoding_ThrowsInvalidOperationException_IfItDoesNotHaveAValidEncoding()
        {
            // Arrange
            var formatter = new TestFormatter();

            var context = new InputFormatterContext(
                new DefaultHttpContext(),
                "something",
                new ModelStateDictionary(),
                new EmptyModelMetadataProvider().GetMetadataForType(typeof(object)),
                (stream, encoding) => new StreamReader(stream, encoding));

            context.HttpContext.Request.ContentLength = 1;

            // Act & Assert
            Assert.Throws <InvalidOperationException>(() => formatter.TestSelectCharacterEncoding(context));
        }
        public void SelectCharacterEncoding_ReturnsNull_IfItCanNotUnderstandContentTypeEncoding(string charset)
        {
            // Arrange
            var formatter = new TestFormatter();

            formatter.SupportedEncodings.Add(Encoding.UTF32);

            var context = new InputFormatterContext(
                new DefaultHttpContext(),
                "something",
                new ModelStateDictionary(),
                new EmptyModelMetadataProvider().GetMetadataForType(typeof(object)),
                (stream, encoding) => new StreamReader(stream, encoding));

            context.HttpContext.Request.ContentType = "application/json;charset=" + charset;

            // Act
            var result = formatter.TestSelectCharacterEncoding(context);

            // Assert
            Assert.Null(result);
        }
        public void SelectCharacterEncoding_ReturnsAsciiEncoding_IfContentTypeIsAnAlias(string charset)
        {
            // Arrange
            var formatter = new TestFormatter();

            formatter.SupportedEncodings.Add(Encoding.UTF32);
            formatter.SupportedEncodings.Add(Encoding.ASCII);

            var context = new InputFormatterContext(
                new DefaultHttpContext(),
                "something",
                new ModelStateDictionary(),
                new EmptyModelMetadataProvider().GetMetadataForType(typeof(object)),
                (stream, encoding) => new StreamReader(stream, encoding));

            context.HttpContext.Request.ContentType = "application/json;charset=\"" + charset + "\"";

            // Act
            var result = formatter.TestSelectCharacterEncoding(context);

            // Assert
            Assert.Equal(Encoding.ASCII, result);
        }
        public void SelectCharacterEncoding_ReturnsFirstEncoding_IfContentTypeIsNotSpecifiedOrDoesNotHaveEncoding(string contentType)
        {
            // Arrange
            var formatter = new TestFormatter();

            formatter.SupportedEncodings.Add(Encoding.UTF8);
            formatter.SupportedEncodings.Add(Encoding.UTF32);

            var context = new InputFormatterContext(
                new DefaultHttpContext(),
                "something",
                new ModelStateDictionary(),
                new EmptyModelMetadataProvider().GetMetadataForType(typeof(object)),
                (stream, encoding) => new StreamReader(stream, encoding));

            context.HttpContext.Request.ContentType = contentType;

            // Act
            var result = formatter.TestSelectCharacterEncoding(context);

            // Assert
            Assert.Equal(Encoding.UTF8, result);
        }