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); }
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); } }
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(); } }