public void WriteRawArgumentTest()
        {
            var             fio = new Mock <IFileIO>(MockBehavior.Strict);
            FormattedWriter fw  = new FormattedWriter(fio.Object);

            Executing.This(() => fw.WriteRaw(null)).Should().Throw <ArgumentNullException>();
        }
        public void NameValueSectionRoundTrip1EntryTest()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);

            ISectionFormatter f = new NameValueSectionFormatter();
            wc.Description = new TeaFileDescription();
            wc.Description.NameValues = new NameValueCollection();
            wc.Description.NameValues.Add(new NameValue("someName", 1.23));
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            f.Read(rc);

            rc.Description.Should().Not.Be.Null();
            rc.Description.NameValues.Should().Not.Be.Null();
            rc.Description.NameValues.Should().Have.Count.EqualTo(1);
            rc.Description.NameValues.First().Name.Should().Be("someName");
            rc.Description.NameValues.First().GetValue<double>().Should().Be(1.23);
        }
        public void ItemSectionRoundTrip()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            var writeID =
                wc.Description.ItemDescription = ItemDescription.FromAnalysis<Event<OHLCV>>();
            ISectionFormatter f = new ItemSectionFormatter();
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            rc.Description.Should().Not.Be.Null();
            f.Read(rc);
            rc.Description.Should().Not.Be.Null();
            var id = rc.Description.ItemDescription;

            id.ItemTypeName.Should().Be(typeof (Event<OHLCV>).GetLanguageName());
            id.ItemSize.Should().Be(wc.Description.ItemDescription.ItemSize);
            id.Fields.Select(ff => ff.Name).Should().Have.SameValuesAs("Time", "Open", "High", "Low", "Close", "Volume");
            id.Fields.Select(ff => ff.Index).Should().Have.SameValuesAs(0, 1, 2, 3, 4, 5);
            id.Fields.Select(ff => ff.FieldType).Should().Have.SameValuesAs(FieldType.Int64, FieldType.Double, FieldType.Double, FieldType.Double, FieldType.Double);
            id.Fields.Select(ff => ff.Offset).Should().Have.SameValuesAs(writeID.Fields.Select(ff => ff.Offset));

            ms.Position.Should().Be(ms.Length); // very important, all bytes must have been read
        }
 public void WriteInt32Test()
 {
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     fio.Setup(io => io.WriteInt32(1743));
     FormattedWriter fw = new FormattedWriter(fio.Object);
     fw.WriteInt32(1743);
     fio.Verify(f => f.WriteInt32(1743), Times.Once());
 }
 public void WriteInt64Test()
 {
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     fio.Setup(io => io.WriteInt64(0x7fffeeeebbbbaaaa));
     FormattedWriter fw = new FormattedWriter(fio.Object);
     fw.WriteInt64(0x7fffeeeebbbbaaaa);
     fio.Verify(f => f.WriteInt64(0x7fffeeeebbbbaaaa), Times.Once());
 }
 public void WriteDoubleTest()
 {
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     fio.Setup(io => io.WriteDouble(1.2345));
     FormattedWriter fw = new FormattedWriter(fio.Object);
     fw.WriteDouble(1.2345);
     fio.Verify(f => f.WriteDouble(1.2345), Times.Once());
 }
 public void WriteRawTest()
 {
     byte[] bytes = new byte[] {1, 3, 7, 8, 9};
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     fio.Setup(io => io.WriteBytes(It.IsAny<byte[]>()));
     FormattedWriter fw = new FormattedWriter(fio.Object);
     fw.WriteRaw(bytes);
     fio.Verify(f => f.WriteBytes(It.Is<byte[]>(bs => bs.SequenceEqual(bytes))), Times.Once());
 }
        public void WriteDoubleTest()
        {
            var fio = new Mock <IFileIO>(MockBehavior.Strict);

            fio.Setup(io => io.WriteDouble(1.2345));
            FormattedWriter fw = new FormattedWriter(fio.Object);

            fw.WriteDouble(1.2345);
            fio.Verify(f => f.WriteDouble(1.2345), Times.Once());
        }
        public void WriteInt32Test()
        {
            var fio = new Mock <IFileIO>(MockBehavior.Strict);

            fio.Setup(io => io.WriteInt32(1743));
            FormattedWriter fw = new FormattedWriter(fio.Object);

            fw.WriteInt32(1743);
            fio.Verify(f => f.WriteInt32(1743), Times.Once());
        }
        public void WriteInt64Test()
        {
            var fio = new Mock <IFileIO>(MockBehavior.Strict);

            fio.Setup(io => io.WriteInt64(0x7fffeeeebbbbaaaa));
            FormattedWriter fw = new FormattedWriter(fio.Object);

            fw.WriteInt64(0x7fffeeeebbbbaaaa);
            fio.Verify(f => f.WriteInt64(0x7fffeeeebbbbaaaa), Times.Once());
        }
        public void WriteRawTest()
        {
            byte[] bytes = new byte[] { 1, 3, 7, 8, 9 };
            var    fio   = new Mock <IFileIO>(MockBehavior.Strict);

            fio.Setup(io => io.WriteBytes(It.IsAny <byte[]>()));
            FormattedWriter fw = new FormattedWriter(fio.Object);

            fw.WriteRaw(bytes);
            fio.Verify(f => f.WriteBytes(It.Is <byte[]>(bs => bs.SequenceEqual(bytes))), Times.Once());
        }
        public void WriteGuidTest()
        {
            Guid g = Guid.NewGuid(); // not strictly deterministic but deterministic enough
            var guidBytes = g.ToByteArray();
            var fio = new Mock<IFileIO>(MockBehavior.Default);
            fio.Setup(io => io.WriteBytes(It.IsAny<byte[]>()));

            var fw = new FormattedWriter(fio.Object);
            fw.WriteGuid(g);

            fio.Verify(f => f.WriteBytes(It.IsAny<byte[]>()), Times.Once());
        }
        public void WriteNullTextTest()
        {
            const string testText = null;
            var          fio      = new Mock <IFileIO>(MockBehavior.Strict);

            fio.Setup(io => io.WriteInt32(It.IsAny <int>()));
            fio.Setup(io => io.WriteBytes(It.IsAny <byte[]>()));
            FormattedWriter fw = new FormattedWriter(fio.Object);

            fw.WriteText(testText);
            fio.Verify(f => f.WriteInt32(0), Times.Once());
        }
        public void WriteTextTest()
        {
            const string testText =
                "Traditionnellement, il est conseillé d'accompagner cette soupe et ses poissons soit d'un vin rosé issu du vignoble de Provence, soit d'un vin rouge. €";
            var fio = new Mock <IFileIO>(MockBehavior.Strict);

            fio.Setup(io => io.WriteInt32(It.IsAny <int>()));
            fio.Setup(io => io.WriteBytes(It.IsAny <byte[]>()));
            FormattedWriter fw = new FormattedWriter(fio.Object);

            fw.WriteText(testText);
            fio.Verify(f => f.WriteInt32(It.Is <int>(n => n >= testText.Length)), Times.Once());
            fio.Verify(f => f.WriteBytes(It.Is <byte[]>(bytes => (new UTF8Encoding(false, true).GetString(bytes)) == testText)), Times.Once());
        }
        public void WriteGuidTest()
        {
            Guid g         = Guid.NewGuid(); // not strictly deterministic but deterministic enough
            var  guidBytes = g.ToByteArray();
            var  fio       = new Mock <IFileIO>(MockBehavior.Default);

            fio.Setup(io => io.WriteBytes(It.IsAny <byte[]>()));

            var fw = new FormattedWriter(fio.Object);

            fw.WriteGuid(g);

            fio.Verify(f => f.WriteBytes(It.IsAny <byte[]>()), Times.Once());
        }
        public void NameValueRoundTripTest()
        {
            var stream = new MemoryStream();
            var fio    = new FileIO(stream);
            var w      = new FormattedWriter(fio);

            Guid         g        = new Guid("1116C195-8975-4E73-B777-23E1C548BC71");
            const string testText = "some text with special characters €,@, ʤǤDŽƪҗ∰";

            {
                var nv1 = new NameValue("name1", 1.23);
                var nv2 = new NameValue("name2", 722);
                var nv3 = new NameValue("name3", g);
                var nv4 = new NameValue("name4", testText);

                w.WriteNameValue(nv1);
                w.WriteNameValue(nv2);
                w.WriteNameValue(nv3);
                w.WriteNameValue(nv4);
            }

            stream.Position = 0;

            var r = new FormattedReader(fio);
            {
                var nv1 = r.ReadNameValue();
                nv1.Name.Should().Be("name1");
                nv1.GetValue <double>().Should().Be(1.23);
                nv1.Kind.Should().Be(NameValue.ValueKind.Double);

                var nv2 = r.ReadNameValue();
                nv2.Name.Should().Be("name2");
                nv2.GetValue <int>().Should().Be(722);
                nv2.Kind.Should().Be(NameValue.ValueKind.Int32);

                var nv3 = r.ReadNameValue();
                nv3.Name.Should().Be("name3");
                nv3.GetValue <Guid>().Should().Be(g);
                nv3.Kind.Should().Be(NameValue.ValueKind.Guid);

                var nv4 = r.ReadNameValue();
                nv4.Name.Should().Be("name4");
                nv4.GetValue <string>().Should().Be(testText);
                nv4.Kind.Should().Be(NameValue.ValueKind.Text);
            }
        }
        public void ContentSectionFormatterRoundTrip()
        {
            const string testValue = "Météo pour Paris, France. @€";

            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            wc.Description.ContentDescription = testValue;
            ISectionFormatter f = new ContentSectionFormatter();
            f.Write(wc);
            ms.Position = 0;
            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            f.Read(rc);
            rc.Description.Should().Not.Be.Null();
            rc.Description.ContentDescription.Should().Be(testValue);
        }
Example #18
0
        /// <summary>
        /// Creates the header's sections from the descriptions found in the context. Computes their positions 
        /// and sets the FirstItemPosition property in the context.
        /// </summary>
        internal byte[] CreateSections(WriteContext wc)
        {
            var saved = wc.Writer;

            using (var sectionStream = new MemoryStream()) // see noop-Dispose comment below
            {
                var sectionWriter = new FormattedWriter(new FileIO(sectionStream));
                int pos = 32; // sections start at byte position 32
                foreach (var formatter in this.sectionFormatters)
                {
                    // payload
                    using (var payloadStream = new MemoryStream()) // actually MemoryStream.Dispose() is a noop here, but for the code analysers pleasure we wrap these usings around
                    {
                        wc.Writer = new FormattedWriter(new FileIO(payloadStream));
                        formatter.Write(wc);
                        var size = (int)payloadStream.Length;
                        if (size > 0)
                        {
                            // section id
                            sectionWriter.WriteInt32(formatter.Id);
                            pos += 4;

                            // nextSectionOffset
                            sectionWriter.WriteInt32(size);
                            pos += 4;

                            // payload
                            sectionWriter.WriteRaw(payloadStream.ToArray());
                            pos += size; // no padding or spacing done here

                            wc.SectionCount++;
                        }
                    }
                }

                // padding
                int paddingBytes = (8 - pos % 8);
                if (paddingBytes == 8) paddingBytes = 0;
                sectionWriter.WriteRaw(new byte[paddingBytes]);
                wc.ItemAreaStart = pos + paddingBytes; // first item starts padded on 8 byte boundary.

                wc.Writer = saved;
                return sectionStream.ToArray();
            }
        }
        public void TimeSectionValuesRoundTrip()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            wc.Description.ItemDescription = ItemDescription.FromAnalysis<Event<C>>();
            Time.Scale = Timescale.FromEpoch(33, 77);
            wc.Description.Timescale = Time.Scale;
            ISectionFormatter f = new TimeSectionFormatter();
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            rc.Description.Should().Not.Be.Null();
            rc.Description.ItemDescription = wc.Description.ItemDescription;

            f.Read(rc);
            rc.Description.Timescale.Value.Epoch.Should().Be(33);
            rc.Description.Timescale.Value.TicksPerDay.Should().Be(77);

            Executing.This(() => f.Read(rc)).Should().Throw<EndOfStreamException>();
        }
        public void FirstTimeFieldIsAutomaticallyEventTime()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            wc.Description.ItemDescription = ItemDescription.FromAnalysis<C2>();
            wc.Description.Timescale = Time.Scale;
            ISectionFormatter f = new TimeSectionFormatter();
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            rc.Description.Should().Not.Be.Null();
            rc.Description.ItemDescription = ItemDescription.FromAnalysis<C2>();

            f.Read(rc);

            var fields = rc.Description.ItemDescription.Fields;
            fields[0].IsEventTime.Should().Be.True();
            fields[1].IsEventTime.Should().Be.False();
        }
        public void EventTimeAttributeRoundTrip()
        {
            Time.Scale = Timescale.Net;

            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            wc.Description.ItemDescription = ItemDescription.FromAnalysis<Event<C>>();
            wc.Description.Timescale = Time.Scale;
            ISectionFormatter f = new TimeSectionFormatter();
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            rc.Description.Should().Not.Be.Null();
            rc.Description.ItemDescription = wc.Description.ItemDescription;
            rc.Description.ItemDescription.Fields.ForEach(ff => ff.IsEventTime = ff.IsTime = false); // reset flags

            f.Read(rc);

            rc.Description.ItemDescription.Fields.Count(ff => ff.IsTime).Should().Be(1);
            rc.Description.ItemDescription.Fields.Count(ff => ff.IsEventTime).Should().Be(1);
            rc.Description.Timescale.Value.Epoch.Should().Be(0);
            rc.Description.Timescale.Value.TicksPerDay.Should().Be(TimeSpan.TicksPerDay);
        }
        public void TimeSectionRoundTrip()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            wc.Description.ItemDescription = ItemDescription.FromAnalysis<Event<C>>();
            wc.Description.Timescale = Time.Scale;
            ISectionFormatter f = new TimeSectionFormatter();
            f.Write(wc);

            ms.Position = 0;
            ms.Length.Should().Be(24); // epoch(8) ticksperday(8) fieldcount(4) + timefieldoffset(4) = 24

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            rc.Description.Should().Not.Be.Null();
            rc.Description.ItemDescription = wc.Description.ItemDescription; // this makes the test a bit weaker, but we need some item description here
            f.Read(rc);
            rc.Description.Should().Not.Be.Null();
            rc.Description.Timescale.HasValue.Should().Be.True();
        }
        public void TimeSectionRoundTripFieldIsNotInItemDescriptionError()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);
            wc.Description = new TeaFileDescription();
            wc.Description.ItemDescription = ItemDescription.FromAnalysis<Event<C>>();
            wc.Description.Timescale = Time.Scale;
            ISectionFormatter f = new TimeSectionFormatter();
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            rc.Description.Should().Not.Be.Null();
            rc.Description.ItemDescription = ItemDescription.FromAnalysis<C2>();

            Executing.This(() => f.Read(rc)).Should().Throw<FileFormatException>();
        }
 public void WriteTextTest()
 {
     const string testText =
         "Traditionnellement, il est conseillé d'accompagner cette soupe et ses poissons soit d'un vin rosé issu du vignoble de Provence, soit d'un vin rouge. €";
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     fio.Setup(io => io.WriteInt32(It.IsAny<int>()));
     fio.Setup(io => io.WriteBytes(It.IsAny<byte[]>()));
     FormattedWriter fw = new FormattedWriter(fio.Object);
     fw.WriteText(testText);
     fio.Verify(f => f.WriteInt32(It.Is<int>(n => n >= testText.Length)), Times.Once());
     fio.Verify(f => f.WriteBytes(It.Is<byte[]>(bytes => (new UTF8Encoding(false, true).GetString(bytes)) == testText)), Times.Once());
 }
 public void WriteRawArgumentTest()
 {
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     FormattedWriter fw = new FormattedWriter(fio.Object);
     Executing.This(() => fw.WriteRaw(null)).Should().Throw<ArgumentNullException>();
 }
        public void NameValueSectionRoundTrip3EntriesTest()
        {
            var ms = new MemoryStream();
            var fio = new FileIO(ms);
            var fw = new FormattedWriter(fio);
            var wc = new WriteContext(fw);

            ISectionFormatter f = new NameValueSectionFormatter();
            wc.Description = new TeaFileDescription();
            wc.Description.NameValues = new NameValueCollection();
            wc.Description.NameValues.Add(new NameValue("someName", 1.23));
            wc.Description.NameValues.Add(new NameValue("someName2", "second value"));
            wc.Description.NameValues.Add(new NameValue("someName3", 333));
            f.Write(wc);

            ms.Position = 0;

            var fr = new FormattedReader(fio);
            var rc = new ReadContext(fr);
            f.Read(rc);

            rc.Description.Should().Not.Be.Null();
            rc.Description.NameValues.Should().Not.Be.Null();
            rc.Description.NameValues.Should().Have.Count.EqualTo(3);
            rc.Description.NameValues.Select(nv => nv.Name).Should().Have.SameSequenceAs("someName", "someName2", "someName3");
            rc.Description.NameValues.Select(nv => nv.GetValue<object>()).Should().Have.SameSequenceAs(1.23, "second value", 333);
        }
 public void WriteNullTextTest()
 {
     const string testText = null;
     var fio = new Mock<IFileIO>(MockBehavior.Strict);
     fio.Setup(io => io.WriteInt32(It.IsAny<int>()));
     fio.Setup(io => io.WriteBytes(It.IsAny<byte[]>()));
     FormattedWriter fw = new FormattedWriter(fio.Object);
     fw.WriteText(testText);
     fio.Verify(f => f.WriteInt32(0), Times.Once());
 }
        public void NameValueRoundTripTest()
        {
            var stream = new MemoryStream();
            var fio = new FileIO(stream);
            var w = new FormattedWriter(fio);

            Guid g = new Guid("1116C195-8975-4E73-B777-23E1C548BC71");
            const string testText = "some text with special characters €,@, ʤǤDŽƪҗ∰";
            {
                var nv1 = new NameValue("name1", 1.23);
                var nv2 = new NameValue("name2", 722);
                var nv3 = new NameValue("name3", g);
                var nv4 = new NameValue("name4", testText);

                w.WriteNameValue(nv1);
                w.WriteNameValue(nv2);
                w.WriteNameValue(nv3);
                w.WriteNameValue(nv4);
            }

            stream.Position = 0;

            var r = new FormattedReader(fio);
            {
                var nv1 = r.ReadNameValue();
                nv1.Name.Should().Be("name1");
                nv1.GetValue<double>().Should().Be(1.23);
                nv1.Kind.Should().Be(NameValue.ValueKind.Double);

                var nv2 = r.ReadNameValue();
                nv2.Name.Should().Be("name2");
                nv2.GetValue<int>().Should().Be(722);
                nv2.Kind.Should().Be(NameValue.ValueKind.Int32);

                var nv3 = r.ReadNameValue();
                nv3.Name.Should().Be("name3");
                nv3.GetValue<Guid>().Should().Be(g);
                nv3.Kind.Should().Be(NameValue.ValueKind.Guid);

                var nv4 = r.ReadNameValue();
                nv4.Name.Should().Be("name4");
                nv4.GetValue<string>().Should().Be(testText);
                nv4.Kind.Should().Be(NameValue.ValueKind.Text);
            }
        }