public void TimeValuesAreCorrect()
        {
            Time.Scale = Timescale.Net;

            const string filename = "TeaFileTest_TimeValuesAreCorrect.tea";

            using (var tf = TeaFile <OHLCV3> .Create(filename))
            {
                tf.Write(new OHLCV3 {
                    High = 71, Low = 20, Open = 33, Close = 21, Time = new DateTime(2000, 7, 6)
                });
                tf.Write(new OHLCV3 {
                    High = 72, Low = 20, Open = 34, Close = 22, Time = new DateTime(2000, 7, 11)
                });
            }
            using (var tf = TeaFile.OpenRead(filename))
            {
                tf.Items.Count.Should().Be(2);
                var timeField = tf.Description.ItemDescription.GetFieldByName("Time");

                var item = tf.Read();
                var time = tf.GetFieldValue(item, timeField);
                time.Should().Be(new Time(2000, 7, 6));

                item = tf.Read();
                time = tf.GetFieldValue(item, timeField);
                time.Should().Be(new Time(2000, 7, 11));
            }
        }
        public void ZeroTeaFile()
        {
            var filename = Path.GetFullPath("TeaFileTest_ZeroTeaFile.tea");

            using (var ms = new FileStream(filename, FileMode.Create))
            {
                var w = new BinaryWriter(ms);
                w.Write(HeaderManager.Signature); // sig
                w.Write((long)32);                // itemstart
                w.Write((long)0);                 // itemendmarker
                w.Write((long)0);                 // sectioncount
            }

            var fi = new FileInfo(filename);

            fi.Length.Should().Be(32);

            using (var tf = TeaFile.OpenRead(filename))
            {
                ((IItemReader)tf).CanRead.Should().Be.False();
                tf.Name.Should().Be(filename);

                Executing.This(() => tf.Items.ToString()).Should().Throw <InvalidOperationException>();
                Executing.This(() => tf.Read()).Should().Throw <InvalidOperationException>();
                Executing.This(() => tf.GetFieldValue(0, null)).Should().Throw <ArgumentNullException>();
                Executing.This(() => tf.GetEventTime(null)).Should().Throw <InvalidOperationException>();
                tf.Description.Should().Not.Be.Null();

                // in summary, a TeaFile that opens a TeaFile without description cannot do much. Being able to open it
                // gives the information that the file has no description. Moreover, a TeaFile might hold no item description
                // but for instance a content description which would be readable although no access to the items is available.
            }
        }
        public void ZeroTeaFilesEvilBrother()
        {
            var filename = Path.GetFullPath("TeaFileTest_ZeroTeaFilesEvilBrother.tea");

            using (var ms = new FileStream(filename, FileMode.Create))
            {
                var w = new BinaryWriter(ms);
                w.Write(HeaderManager.Signature); // sig
                w.Write((long)32);                // itemstart
                w.Write((long)32);                // itemendmarker <- zero tea file's evil brother has a marker with 32
                w.Write((long)0);                 // sectioncount
            }

            var fi = new FileInfo(filename);

            fi.Length.Should().Be(32);

            using (var tf = TeaFile.OpenRead(filename))
            {
                ((IItemReader)tf).CanRead.Should().Be.False();
                tf.Name.Should().Be(filename);

                tf.Description.Should().Not.Be.Null();

                Executing.This(() => tf.Items.ToString()).Should().Throw <InvalidOperationException>();
                Executing.This(() => tf.Read()).Should().Throw <InvalidOperationException>();
            }
        }
        public void CreateZeroTeaFile()
        {
            var ms = new MemoryStream();
            var tf = TeaFile <Event <OHLCV> > .Create(ms, null, null, false);

            tf.Dispose();
            ms.Length.Should().Be(32);
            ms.Position = 0;
            var r   = new BinaryReader(ms);
            var bom = r.ReadInt64();

            bom.Should().Be(0x0d0e0a0402080500);
            var itemstart = r.ReadInt64();

            itemstart.Should().Be(32);
            var eof = r.ReadInt64();

            eof.Should().Be(0);
            var sectionCount = r.ReadInt64();

            sectionCount.Should().Be(0);

            ms.Position = 0;
            var tf2 = TeaFile.OpenRead(ms);
            var d   = tf2.Description;

            d.ItemDescription.Should().Be.Null();
            d.ContentDescription.Should().Be.Null();
            d.NameValues.Should().Be.Null();
        }
        public void OpenWriteStream()
        {
            Stream stream = new MemoryStream();

            using (var tf = TeaFile <int> .Create(stream))
            {
                tf.Write(Enumerable.Range(1, 10));
            }
            stream.Position = 0;
            using (var tf = TeaFile <int> .OpenWrite(stream))
            {
                tf.Write(Enumerable.Range(70, 5));
            }
            stream.Position = 0;
            using (var tf = TeaFile <int> .OpenRead(stream))
            {
                tf.Count.Should().Be(10);

                tf.Read().Should().Be(70);
                tf.Read().Should().Be(71);
                tf.Read().Should().Be(72);
                tf.Read().Should().Be(73);
                tf.Read().Should().Be(74);
                tf.Read().Should().Be(6);
                tf.Read().Should().Be(7);
                tf.Read().Should().Be(8);
                tf.Read().Should().Be(9);
                tf.Read().Should().Be(10);
            }
        }
        public void OpenWrite()
        {
            var filename = "TeaFileTTest_OpenWrite.tea";

            using (var tf = TeaFile <int> .Create(filename))
            {
                tf.Count.Should().Be(0);
                tf.Write(Enumerable.Range(1, 10));
                tf.Count.Should().Be(10);
            }
            using (var tf = TeaFile <int> .OpenRead(filename))
            {
                tf.Items.ForEach(Console.WriteLine);
            }
            using (var tf = TeaFile <int> .OpenWrite(filename))
            {
                tf.Count.Should().Be(10);
                tf.Write(Enumerable.Range(1, 5));
                tf.Count.Should().Be(10);
                tf.Write(Enumerable.Range(1, 5));
                tf.Count.Should().Be(10);
                tf.Write(Enumerable.Range(1, 5));
                tf.Count.Should().Be(15);
            }
            Console.WriteLine("..................");
            using (var tf = TeaFile <int> .OpenRead(filename))
            {
                tf.Items.ForEach(Console.WriteLine);
            }
        }
        public void ExoticCoverage()
        {
            Executing.This(() => TeaFile <int> .Create((string)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Create((string)null, "contento", null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Create((string)null, "a", null, true)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Create((Stream)null, "a", null, true)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Create((Stream)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Create((Stream)null, "contento", null)).Should().Throw <ArgumentNullException>();

            Executing.This(() => TeaFile <int> .OpenRead((Stream)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .OpenRead((Stream)null, ItemDescriptionElements.None)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .OpenRead((string)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .OpenRead((string)null, ItemDescriptionElements.None)).Should().Throw <ArgumentNullException>();

            Executing.This(() => TeaFile <int> .OpenWrite((Stream)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .OpenWrite((Stream)null, ItemDescriptionElements.None)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .OpenWrite((string)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .OpenWrite((string)null, ItemDescriptionElements.None)).Should().Throw <ArgumentNullException>();

            Executing.This(() => TeaFile <int> .Append(null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Append(null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile <int> .Append(null, ItemDescriptionElements.None)).Should().Throw <ArgumentNullException>();

            var stream = new MemoryStream();

            using (var tf = TeaFile <int> .Create(stream))
            {
                tf.Write(Enumerable.Range(100, 7));
            }
            stream.Position = 0;
            using (var tf = TeaFile <int> .OpenRead(stream))
            {
                tf.Items.GetEnumerator().Should().Not.Be.Null();
            }
        }
        public void ZeroTeaFilesGoodBrother()
        {
            var filename = Path.GetFullPath(MethodBase.GetCurrentMethod() + ".tea");

            using (var ms = new FileStream(filename, FileMode.Create))
            {
                var w = new BinaryWriter(ms);
                w.Write(HeaderManager.Signature); // sig
                w.Write((long)32);                // itemstart
                w.Write((long)32);                // itemendmarker <- zero tea file's evil brother has a marker with 32
                w.Write((long)0);                 // sectioncount
                10.Times(() => w.Write(0L));      // increase file length, now the preallocation makes sense, and evil brother becomes a good one
            }

            var fi = new FileInfo(filename);

            fi.Length.Should().Be(32 + 10 * 8);

            using (var tf = TeaFile.OpenRead(filename))
            {
                ((IItemReader)tf).CanRead.Should().Be.False();
                tf.Name.Should().Be(filename);

                tf.Description.Should().Not.Be.Null(); // the description should never be null

                Executing.This(() => tf.Items.ToString()).Should().Throw <InvalidOperationException>();
                Executing.This(() => tf.Read()).Should().Throw <InvalidOperationException>();
            }
        }
        public void GetEnumeratorTest()
        {
            var filename = "ItemCollectionTest_GetEnumeratorTest.tea";

            using (var tf = TeaFile <int> .Create(filename))
            {
                tf.Write(Enumerable.Range(2, 4));
            }
            using (var tf = TeaFile.OpenRead(filename))
            {
                var e = tf.Items.GetEnumerator(0);
                e.MoveNext().Should().Be.True();
                e.Current.Values[0].Should().Be(2);
                e.MoveNext().Should().Be.True();
                e.Current.Values[0].Should().Be(3);
                e.MoveNext().Should().Be.True();
                e.Current.Values[0].Should().Be(4);
                e.MoveNext().Should().Be.True();
                e.Current.Values[0].Should().Be(5);
                e.MoveNext().Should().Be.False();

                e = tf.Items.GetEnumerator(2);
                e.MoveNext().Should().Be.True();
                e.Current.Values[0].Should().Be(4);
                e.MoveNext().Should().Be.True();
                e.Current.Values[0].Should().Be(5);
                e.MoveNext().Should().Be.False();
            }
        }
        public void OpeningFileWithWrongSignatureThrowsFileFormatException()
        {
            const string filename = "TeaFileTest_OpeningFileWithWrongSignatureThrowsFileFormatException.tea";

            File.WriteAllBytes(filename, BitConverter.GetBytes(1700L)); // wrong signature value
            Executing.This(() => TeaFile.OpenRead(filename)).Should().Throw <FileFormatException>()
            .Exception.Message.Should().Contain("Signature");
        }
        public void OpeningEmptyFileThrowsFileFormatException()
        {
            const string filename = "TeaFileTest_OpeningEmptyFileThrowsException.tea";

            File.WriteAllBytes(filename, new byte[0]);
            var ex = Executing.This(() => TeaFile.OpenRead(filename)).Should().Throw <FileFormatException>().Exception;

            Console.WriteLine(ex.Message);
        }
        public void AccessorTest()
        {
            var filename = "TeaFileTTest_AccessorTest.tea";

            using (TeaFile <Tick> .Create(filename))
            {
                //  an empty file holding the description is enough for this test
            }
            Executing.This(() => TeaFile <OHLCV> .OpenRead(filename)).Should().Throw <TypeMismatchException>();
        }
        public void OpenReadOfNonExistentFile()
        {
            const string filename = "TeaFileTTest_OpenReadOfNonExistentFile.tea";

            Executing.This(() => TeaFile <int> .OpenRead(filename)).Should().Throw();

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
        }
        public void OpeningFileWithCorrrectSignatureThrowsExceptionWithoutSignatureMessage()
        {
            var filename = Path.GetTempFileName();

            File.WriteAllBytes(filename, BitConverter.GetBytes(0x0d0e0a0402080500));
            var ex = Executing.This(() => TeaFile.OpenRead(filename)).Should().Throw <FileFormatException>().Exception;

            ex.Message.Should().Not.Contain("Signature");
            Console.WriteLine(ex.Message);
        }
Esempio n. 15
0
        public void DescriptionOfZeroFileIsNotNull()
        {
            var filename = "DescriptionTest_DescriptionOfZeroFileIsNotNull.tea";

            using (TeaFile <StructA> .Create(filename))
            {
            }
            using (var tf = TeaFile <StructA> .OpenRead(filename))
            {
                tf.Description.Should().Not.Be.Null();
            }
        }
        public void ExoticCoverage()
        {
            Executing.This(() => TeaFile.OpenRead((string)null)).Should().Throw <ArgumentNullException>();
            Executing.This(() => TeaFile.OpenRead((Stream)null)).Should().Throw <ArgumentNullException>();
            var stream = TestUtils.GetTeaFileEventInt7Values();
            var tf     = TeaFile.OpenRead(stream);

            Executing.This(() => tf.GetFieldValue(null, null)).Should().Throw <ArgumentNullException>();
            Item item = new Item(2);

            Executing.This(() => tf.GetFieldValue(item, null)).Should().Throw <ArgumentNullException>();
        }
        public void DiscDriveFailureDuringHeaderReading()
        {
            var stream = new TestStream();

            using (var tf = TeaFile <int> .Create(stream))
            {
                tf.Write(111);
            }
            stream.Position          = 0;
            stream.FailAfterPosition = 17;
            Executing.This(() => TeaFile <int> .OpenRead(stream)).Should().Throw <FileFormatException>()
            .Exception.InnerException.Should().Be.OfType <IOException>();
        }
        public void TimeScaleCollisionIgnored()
        {
            Time.ScaleCollisionBehavior = ScaleCollisionBehavior.Ignore;
            Time.Scale = Timescale.FromEpoch(2000, 1, 1, 86400);
            var stream = new MemoryStream();

            using (var tf = TeaFile <Event <int> > .Create(stream))
            {
            }
            stream.Position = 0;
            Time.Scale      = Timescale.Net;
            TeaFile.OpenRead(stream);
        }
        public void TimeScaleCollisionThrowsTimescaleException()
        {
            Time.ScaleCollisionBehavior = ScaleCollisionBehavior.ThrowException;
            Time.Scale = Timescale.FromEpoch(2000, 1, 1, 86400);
            var stream = new MemoryStream();

            using (var tf = TeaFile <Event <int> > .Create(stream))
            {
            }
            stream.Position = 0;
            Time.Scale      = Timescale.Net;
            Executing.This(() => TeaFile.OpenRead(stream)).Should().Throw <TimescaleException>();
        }
        public void EventTimeFieldIsNullIfNoSuchFieldExists()
        {
            var stream = new MemoryStream();

            using (var tf = TeaFile <int> .Create(stream))
            {
                tf.Write(1);
            }
            stream.Position = 0;
            using (var tf = TeaFile.OpenRead(stream))
            {
                tf.Description.ItemDescription.EventTimeField.Should().Be.Null();
            }
        }
        public void TimeScaleCollisionUse()
        {
            Time.ScaleCollisionBehavior = ScaleCollisionBehavior.UseNewScale;
            Time.Scale = Timescale.FromEpoch(2000, 1, 1, 86400);
            var stream = new MemoryStream();

            using (TeaFile <Event <int> > .Create(stream))
            {
            }
            stream.Position = 0;
            Time.Scale      = Timescale.Net;
            TeaFile.OpenRead(stream);
            Time.Scale.Should().Be(Timescale.FromEpoch(2000, 1, 1, 86400));
        }
        public void FieldSpacingsComputation()
        {
            var stream = new MemoryStream();

            using (var tf = TeaFile <PaddedStruct> .Create(stream))
            {
            }
            stream.Position = 0;
            using (var tf = TeaFile.OpenRead(stream))
            {
                var itemSize = tf.Description.ItemDescription.ItemSize;
                tf.GetFieldSpacings().Should().Have.SameSequenceAs(1, 2, 5, itemSize - 15);
            }
        }
        public void TimeScale()
        {
            Time.Scale = Timescale.Java;
            var stream = new MemoryStream();

            using (var tf = TeaFile <Event <OHLCV> > .Create(stream))
            {
                tf.Write(new Event <OHLCV> {
                    Time = new Time(1970, 1, 1), Value = new OHLCV {
                        Open = 11, Close = 22
                    }
                });
                tf.Write(new Event <OHLCV> {
                    Time = new Time(1970, 1, 2), Value = new OHLCV {
                        Open = 11, Close = 22
                    }
                });
                tf.Write(new Event <OHLCV> {
                    Time = new Time(1970, 1, 3), Value = new OHLCV {
                        Open = 11, Close = 22
                    }
                });
            }
            stream.Position = 0;
            using (var tf = TeaFile.OpenRead(stream))
            {
                tf.Description.Timescale.Value.Epoch.Should().Be(719162);
                tf.Description.Timescale.Value.TicksPerDay.Should().Be(Timescale.MillisecondsPerDay);

                var time = tf.Description.ItemDescription.GetFieldByName("Time");
                var open = tf.Description.ItemDescription.GetFieldByName("Open");

                foreach (var item in tf.Items)
                {
                    Console.WriteLine(item);
                    Console.WriteLine(tf.GetFieldValue(item, time));
                    Console.WriteLine(tf.GetFieldValue(item, open));
                }

                tf.GetFieldValue(tf.Items[0], time).Should().Be(new Time(1970, 1, 1));

                tf.GetFieldValue(0, time).Should().Be(new Time(1970, 1, 1));
                tf.GetFieldValue(1, time).Should().Be(new Time(1970, 1, 2));
                tf.GetFieldValue(2, time).Should().Be(new Time(1970, 1, 3));

                var t = (Time)tf.GetFieldValue(0, time);
                t.Should().Be(new DateTime(1970, 1, 1));
            }
        }
        public void FieldNames()
        {
            var filename = "TeaFileTTest_FieldNames.tea";

            using (var tf = TeaFile <Event <OHLCV> > .Create(filename))
            {
                var id = tf.Description.ItemDescription;
                id.Fields.Count.Should().Be(6);
                id.Fields.Select(f => f.Name).Should().Have.SameSequenceAs("Time", "Open", "High", "Low", "Close", "Volume");
            }
            using (var tf = TeaFile.OpenRead(filename))
            {
                var id = tf.Description.ItemDescription;
                id.Fields.Select(f => f.Name).Should().Have.SameSequenceAs("Time", "Open", "High", "Low", "Close", "Volume");
            }
        }
        public void CreateAndOpenReadOfFile()
        {
            const string filename = "TeaFileTTest_CreateAndOpenReadOfFile.tea";

            using (var tf = TeaFile <int> .Create(filename))
            {
            }
            TestUtils.IsLocked(filename).Should().Be.False();
            using (var tf = TeaFile <int> .OpenRead(filename))
            {
            }
            TestUtils.IsLocked(filename).Should().Be.False();

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
        }
        public void NameValueDescription()
        {
            var stream     = new MemoryStream();
            var namevalues = new NameValueCollection();

            namevalues.Add("name1", 123).Add("name2", 1.23);
            using (var tf = TeaFile <Event <int> > .Create(stream, "my text", namevalues))
            {
            }
            stream.Position = 0;
            using (var tf = TeaFile.OpenRead(stream))
            {
                tf.Description.NameValues.GetValue <int>("name1").Should().Be(123);
                tf.Description.NameValues.GetValue <double>("name2").Should().Be(1.23);
                tf.Description.ContentDescription.Should().Be("my text");
            }
        }
        public void AppendStreamTest()
        {
            const string filename = "AppendStreamTest";

            using (var tf = TeaFile <int> .Create(filename))
            {
                tf.Write(Enumerable.Range(1, 10));
            }
            using (var tf = TeaFile <int> .Append(filename))
            {
                tf.Write(Enumerable.Range(70, 5));
            }
            using (var tf = TeaFile <int> .OpenRead(filename))
            {
                tf.Count.Should().Be(15);
                tf.Items.Should().Have.SameSequenceAs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 70, 71, 72, 73, 74);
            }
        }
Esempio n. 28
0
        public void ItemsT_CountProperty_reflects_actual_number_of_items()
        {
            string filename = Guid.NewGuid() + "lab1.tea";

            using (TeaFile <OHLCV> f = TeaFile <OHLCV> .Create(filename))
            {
                Assert.AreEqual(0, f.Items.Count);
                f.Write(new OHLCV {
                    Open = 111
                });
                Assert.AreEqual(1, f.Items.Count, "After writing an item, Count is 1");
            }

            using (var f = TeaFile <OHLCV> .OpenRead(filename))
            {
                Assert.AreEqual(1, f.Items.Count);
            }
        }
        public void ItemAreaTest()
        {
            var filename = "TeaFileTest_ItemAreaTest.tea";

            using (var tf = TeaFile <int> .Create(filename))
            {
                tf.ItemAreaSize.Should().Be(0);
                tf.Write(3);
                tf.ItemAreaSize.Should().Be(4);
                tf.Write(71);
                tf.ItemAreaSize.Should().Be(8);
            }
            using (var tf = TeaFile.OpenRead(filename))
            {
                tf.ItemAreaSize.Should().Be(8);
                tf.ItemAreaStart.Should().Be.GreaterThan(0);
                tf.ItemAreaEnd.Should().Be.GreaterThan(0);
                tf.ItemAreaSize.Should().Be.EqualTo(tf.ItemAreaEnd - tf.ItemAreaStart);
            }
        }
        public void UntypedEnumeratorTest()
        {
            var filename = "TeaFileTest_UntypedEnumeratorTest.tea";

            using (var tf = TeaFile <int> .Create(filename))
            {
                tf.Write(Enumerable.Range(10, 3));
            }
            using (var tf = TeaFile <int> .OpenRead(filename))
            {
                var e = ((IEnumerable)tf.Items).GetEnumerator();
                e.MoveNext().Should().Be.True();
                e.Current.Should().Be(10);
                e.MoveNext().Should().Be.True();
                e.Current.Should().Be(11);
                e.MoveNext().Should().Be.True();
                e.Current.Should().Be(12);
                e.MoveNext().Should().Be.False();
            }
        }