public void Read_Always_ReturnsXml()
        {
            // arrange
            var xml = @"2013-5-20,30.16,30.39,30.02,30.17,1478200
            2013-5-17,29.77,30.26,29.77,30.26,2481400
            2013-5-16,29.78,29.94,29.55,29.67,1077000
            2013-5-15,29.63,29.99,29.63,29.98,928700
            2013-5-14,29.53,29.77,29.48,29.6,1065900
            2013-5-13,29.33,29.59,29.09,29.51,1005800
            2013-5-10,29.89,29.91,29.52,29.83,1831000
            2013-5-9,29.65,29.68,29.2,29.3,1693600
            2013-5-8,29.65,29.99,29.54,29.72,1009800
            2013-5-7,29.46,29.62,29.18,29.49,1390200
            2013-5-6,28.8,28.9,28.64,28.78,744800
            2013-5-3,28.85,29.02,28.45,28.56,1087800
            2013-5-2,28.1,28.33,28,28.24,1472500
            2013-5-1,27.94,28.19,27.61,27.7,1006900";
            var expected_first = new TradeData { Date = new DateTime(2013, 5, 20), Open = 30.16m, High = 30.39m, Low = 30.02m, Close = 30.17m, Volume = 1478200 };
            var expected_last = new TradeData { Date = new DateTime(2013, 5, 1), Open = 27.94m, High = 28.19m, Low = 27.61m, Close = 27.7m, Volume = 1006900 };

            // act
            var actual = this.loader.Read(StreamHelper.GetStreamFrom(xml)).ToArray();

            // assert
            Assert.Equal(14, actual.Count());
            AssertTradeData(expected_first, actual.First());
            AssertTradeData(expected_last, actual.Last());
        }
        public void Read_Always_ReturnsXml()
        {
            // arrange
            var xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
            <values>
             <value date=""2013-5-20"" open=""30.16"" high=""30.39"" low=""30.02"" close=""30.17"" volume=""1478200"" />
             <value date=""2013-5-17"" open=""29.77"" high=""30.26"" low=""29.77"" close=""30.26"" volume=""2481400"" />
             <value date=""2013-5-16"" open=""29.78"" high=""29.94"" low=""29.55"" close=""29.67"" volume=""1077000"" />
             <value date=""2013-5-15"" open=""29.63"" high=""29.99"" low=""29.63"" close=""29.98"" volume=""928700"" />
             <value date=""2013-5-14"" open=""29.53"" high=""29.77"" low=""29.48"" close=""29.6"" volume=""1065900"" />
             <value date=""2013-5-13"" open=""29.33"" high=""29.59"" low=""29.09"" close=""29.51"" volume=""1005800"" />
             <value date=""2013-5-10"" open=""29.89"" high=""29.91"" low=""29.52"" close=""29.83"" volume=""1831000"" />
             <value date=""2013-5-9"" open=""29.65"" high=""29.68"" low=""29.2"" close=""29.3"" volume=""1693600"" />
             <value date=""2013-5-8"" open=""29.65"" high=""29.99"" low=""29.54"" close=""29.72"" volume=""1009800"" />
             <value date=""2013-5-7"" open=""29.46"" high=""29.62"" low=""29.18"" close=""29.49"" volume=""1390200"" />
             <value date=""2013-5-6"" open=""28.8"" high=""28.9"" low=""28.64"" close=""28.78"" volume=""744800"" />
             <value date=""2013-5-3"" open=""28.85"" high=""29.02"" low=""28.45"" close=""28.56"" volume=""1087800"" />
             <value date=""2013-5-2"" open=""28.1"" high=""28.33"" low=""28"" close=""28.24"" volume=""1472500"" />
             <value date=""2013-5-1"" open=""27.94"" high=""28.19"" low=""27.61"" close=""27.7"" volume=""1006900"" />
            </values>";
            var expected_first = new TradeData { Date = new DateTime(2013, 5, 20), Open = 30.16m, High = 30.39m, Low = 30.02m, Close = 30.17m, Volume = 1478200 };
            var expected_last = new TradeData { Date = new DateTime(2013, 5, 1), Open = 27.94m, High = 28.19m, Low = 27.61m, Close = 27.7m, Volume = 1006900 };

            // act
            var actual = this.loader.Read(StreamHelper.GetStreamFrom(xml)).ToArray();

            // assert
            Assert.Equal(14, actual.Count());
            AssertTradeData(expected_first, actual.First());
            AssertTradeData(expected_last, actual.Last());
        }
 /// <summary>The read.</summary>
 /// <param name="stream">The stream/</param>
 /// <returns>The <see cref="IEnumerable{TradeData}"/> trade data.</returns>
 public IEnumerable<TradeData> Read(Stream stream)
 {
     var document = XDocument.Load(stream);
     var nodes = document.XPathSelectElements(@"/values/value");
     foreach (var node in nodes)
     {
         var trade = new TradeData();
         trade.Date = DateTime.Parse(node.Attribute("date").Value, this.culture);
         trade.Open = decimal.Parse(node.Attribute("open").Value, this.culture);
         trade.High = decimal.Parse(node.Attribute("high").Value, this.culture);
         trade.Low = decimal.Parse(node.Attribute("low").Value, this.culture);
         trade.Close = decimal.Parse(node.Attribute("close").Value, this.culture);
         trade.Volume = decimal.Parse(node.Attribute("volume").Value, this.culture);
         yield return trade;
     }
 }
 /// <summary>The read.</summary>
 /// <param name="stream">The stream/</param>
 /// <returns>The <see cref="IEnumerable{TradeData}"/> trade data.</returns>
 public IEnumerable<TradeData> Read(Stream stream)
 {
     var reader = new StreamReader(stream, Encoding.UTF8);
     string line = null;
     while ((line = reader.ReadLine()) != null)
     {
         var node = line.Split(',');
         var trade = new TradeData();
         trade.Date = DateTime.Parse(node[0], this.culture);
         trade.Open = decimal.Parse(node[1], this.culture);
         trade.High = decimal.Parse(node[2], this.culture);
         trade.Low = decimal.Parse(node[3], this.culture);
         trade.Close = decimal.Parse(node[4], this.culture);
         trade.Volume = decimal.Parse(node[5], this.culture);
         yield return trade;
     }
 }
 private static void AssertTradeData(TradeData expected, TradeData actual)
 {
     Assert.Equal(expected.Date, actual.Date);
     Assert.Equal(expected.Open, actual.Open);
     Assert.Equal(expected.High, actual.High);
     Assert.Equal(expected.Low, actual.Low);
     Assert.Equal(expected.Close, actual.Close);
     Assert.Equal(expected.Volume, actual.Volume);
 }