Exemplo n.º 1
0
        public void StreamCanReadFromCorrectPlaces()
        {
            var translator = new Mock <IRangeTranslator <string, string> >(MockBehavior.Strict);

            translator
            .Setup(t => t.Translate(ItIsContextRange("a", 0L, 10L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(0L, 10L), "lowercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("b", 0L, 10L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(10L, 10L), "lowercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("c", 0L, 3L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(20L, 3L), "lowercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("c", 3L, 7L)))
            .Returns(new[]
            {
                ContextRange.Create(Range.ByLength(23L, 3L), "lowercase"),
                ContextRange.Create(Range.ByLength(0L, 4L), "uppercase"),
            });
            translator
            .Setup(t => t.Translate(ItIsContextRange("d", 0L, 10L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(4L, 10L), "uppercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("e", 0L, 10L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(14L, 10L), "uppercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("f", 0L, 6L)))
            .Returns(new[]
            {
                ContextRange.Create(Range.ByLength(24L, 2L), "uppercase"),
                ContextRange.Create(Range.ByLength(0L, 4L), "numbers"),
            });
            translator
            .Setup(t => t.Translate(ItIsContextRange("f", 6L, 4L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(4L, 4L), "numbers") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("g", 0L, 2L)))
            .Returns(new[] { ContextRange.Create(Range.ByLength(8L, 2L), "numbers") });
            var payloads = new[]
            {
                Tuple.Create("a", "abcdefghij"),
                Tuple.Create("b", "klmnopqrst"),
                Tuple.Create("c", "uvw"),
                Tuple.Create("c", "xyzABCD"),
                Tuple.Create("d", "EFGHIJKLMN"),
                Tuple.Create("e", "OPQRSTUVWX"),
                Tuple.Create("f", "YZ0123"),
                Tuple.Create("f", "4567"),
                Tuple.Create("g", "89"),
            };
            var streams = new Dictionary <string, MockStream>
            {
                { "lowercase", new MockStream("abcdefghijklmnopqrstuvwxyz") },
                { "uppercase", new MockStream("ABCDEFGHIJKLMNOPQRSTUVWXYZ") },
                { "numbers", new MockStream("0123456789") },
            };
            var results = new Queue <Tuple <string, string> >();

            using (var resourceStore = new ResourceStore <string, Stream>(key => streams[key]))
            {
                var buffer = new byte[100];
                var rand   = new Random();
                foreach (var context in payloads.GroupBy(it => it.Item1, it => it.Item2.Length))
                {
                    using (var stream = new StreamTranslator <string, string>(translator.Object, resourceStore, context.Key, context.Sum(it => it)))
                    {
                        foreach (var payloadSize in context)
                        {
                            var byteIndex = rand.Next(40);
                            stream.Read(buffer, byteIndex, payloadSize);
                            results.Enqueue(Tuple.Create(context.Key, _encoding.GetString(buffer, byteIndex, payloadSize)));
                        }
                    }
                }
            }
            CollectionAssert.AreEqual(payloads, results.ToArray());
            CollectionAssert.AreEquivalent(new[] { 26, 26, 10 }, streams.Values.Select(str => str.Result.Length).ToArray());
        }
Exemplo n.º 2
0
        public void StreamCanWriteToCorrectPlaces()
        {
            var translator = new Mock <IRangeTranslator <string, string> >(MockBehavior.Strict);
            var payloads   = new[]
            {
                Tuple.Create("a", "abcdefghij"),
                Tuple.Create("b", "klmnopqrst"),
                Tuple.Create("c", "uvw"),
                Tuple.Create("c", "xyzABCD"),
                Tuple.Create("d", "EFGHIJKLMN"),
                Tuple.Create("e", "OPQRSTUVWX"),
                Tuple.Create("f", "YZ0123"),
                Tuple.Create("f", "4567"),
                Tuple.Create("g", "89"),
            }.GroupBy(it => it.Item1, it => it.Item2);

            translator
            .Setup(t => t.Translate(ItIsContextRange("a", 0L, 10L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(0L, 10L), "lowercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("b", 0L, 10L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(10L, 10L), "lowercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("c", 0L, 3L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(20L, 3L), "lowercase") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("c", 3L, 7L)))
            .Returns <ContextRange <string> >(cr => new[]
            {
                ContextRange.Create(Range.ByLength(23L, 3L), "lowercase"),
                ContextRange.Create(Range.ByLength(0L, 4L), "uppercase"),
            });
            translator
            .Setup(t => t.Translate(ItIsContextRange("d", 0L, 10L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(4L, 10L), "uppercase"), });
            translator
            .Setup(t => t.Translate(ItIsContextRange("e", 0L, 10L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(14L, 10L), "uppercase"), });
            translator
            .Setup(t => t.Translate(ItIsContextRange("f", 0L, 6L)))
            .Returns <ContextRange <string> >(cr => new[]
            {
                ContextRange.Create(Range.ByLength(24L, 2L), "uppercase"),
                ContextRange.Create(Range.ByLength(0L, 4L), "numbers"),
            });
            translator
            .Setup(t => t.Translate(ItIsContextRange("f", 6L, 4L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(4L, 4L), "numbers") });
            translator
            .Setup(t => t.Translate(ItIsContextRange("g", 0L, 2L)))
            .Returns <ContextRange <string> >(cr => new[] { ContextRange.Create(Range.ByLength(8L, 2L), "numbers"), });
            var streams = new ConcurrentDictionary <string, MockStream>();

            using (var resourceStore = new ResourceStore <string, Stream>(key => streams.GetOrAdd(key, k => new MockStream())))
            {
                var buffer = new byte[100];
                var rand   = new Random();
                foreach (var context in payloads)
                {
                    using (var stream = new StreamTranslator <string, string>(translator.Object, resourceStore, context.Key, context.Sum(it => it.Length)))
                    {
                        foreach (var payload in context)
                        {
                            var byteIndex = rand.Next(40);
                            _encoding.GetBytes(payload, 0, payload.Length, buffer, byteIndex);
                            stream.Write(buffer, byteIndex, payload.Length);
                        }
                    }
                }
            }
            CollectionAssert.AreEquivalent(
                new[]
            {
                new { Key = "lowercase", Result = "abcdefghijklmnopqrstuvwxyz" },
                new { Key = "uppercase", Result = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" },
                new { Key = "numbers", Result = "0123456789" },
            },
                streams.Select(kvp => new { kvp.Key, Result = _encoding.GetString(kvp.Value.Result) })
                );
        }