WChartTest.C 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*
  2. * Copyright (C) 2009 Emweb bvba, Kessel-Lo, Belgium.
  3. *
  4. * See the LICENSE file for terms of use.
  5. */
  6. #include <boost/test/unit_test.hpp>
  7. #include <iostream>
  8. #include <fstream>
  9. #include <Wt/Chart/WCartesianChart>
  10. #include <Wt/Chart/WDataSeries>
  11. #include <Wt/WStandardItemModel>
  12. #include <Wt/WSvgImage>
  13. #include <Wt/WPainter>
  14. #include <Wt/WDate>
  15. #include <Wt/WDateTime>
  16. #include <Wt/WTime>
  17. using namespace Wt;
  18. using namespace Wt::Chart;
  19. namespace {
  20. double plotTimeSeriesChart(WStandardItemModel* model,
  21. std::string fileName,
  22. AxisScale xScale)
  23. {
  24. WCartesianChart chart;
  25. chart.setModel(model);
  26. chart.setXSeriesColumn(0);
  27. chart.setLegendEnabled(true);
  28. chart.setType(ScatterPlot);
  29. chart.axis(XAxis).setScale(xScale);
  30. chart.axis(YAxis).setScale(LogScale);
  31. chart.setPlotAreaPadding(100, Left);
  32. chart.setPlotAreaPadding(50, Top | Bottom);
  33. for (int i = 1; i < model->columnCount(); ++i) {
  34. WDataSeries s(i, LineSeries);
  35. chart.addSeries(s);
  36. }
  37. chart.setMargin(10, Top | Bottom);
  38. chart.setMargin(WLength::Auto, Left | Right);
  39. double result;
  40. {
  41. WSvgImage image(400, 300);
  42. WPainter painter(&image);
  43. chart.paint(painter);
  44. result = chart.axis(YAxis).maximum() - chart.axis(YAxis).minimum();
  45. painter.end();
  46. std::ofstream f(fileName.c_str(), std::ios::out | std::ios::binary);
  47. image.write(f);
  48. f.close();
  49. }
  50. return result;
  51. }
  52. } // end anonymous namespace
  53. BOOST_AUTO_TEST_CASE( chart_test_WDateTimeChartMinutes )
  54. {
  55. WStandardItemModel model;
  56. WDate d(2009, 10, 1);
  57. WDateTime start(d, WTime(1, 24, 0));
  58. WDateTime end(d, WTime(2, 36, 0));
  59. WDateTime dt = start;
  60. int row = 0;
  61. model.insertColumns(0, 2);
  62. while (dt < end) {
  63. model.insertRow(model.rowCount());
  64. model.setData(row, 0, boost::any(dt));
  65. if (row % 10 == 0)
  66. model.setData(row, 1, boost::any());
  67. else
  68. model.setData(row, 1, boost::any(row * 10));
  69. dt = dt.addSecs(60);
  70. row++;
  71. }
  72. plotTimeSeriesChart(&model, "minutes.svg", DateTimeScale);
  73. }
  74. BOOST_AUTO_TEST_CASE( chart_test_WDateTimeChartHours )
  75. {
  76. WStandardItemModel model;
  77. WDate d(2009, 10, 1);
  78. WDateTime start(d, WTime(1, 20, 0));
  79. WDateTime end(d, WTime(23, 30, 0));
  80. WDateTime dt = start;
  81. int row = 0;
  82. model.insertColumns(0, 2);
  83. while (dt < end) {
  84. model.insertRow(model.rowCount());
  85. model.setData(row, 0, boost::any(dt));
  86. model.setData(row, 1, boost::any(row * 10));
  87. dt = dt.addSecs(60);
  88. row++;
  89. }
  90. plotTimeSeriesChart(&model, "hours.svg", DateTimeScale);
  91. }
  92. BOOST_AUTO_TEST_CASE( chart_test_WDateTimeChartDays )
  93. {
  94. WStandardItemModel model;
  95. WDate start(2009, 10, 1);
  96. WDate end(2009, 11, 10);
  97. WDate d = start;
  98. int row = 0;
  99. model.insertColumns(0, 2);
  100. while (d < end) {
  101. model.insertRow(model.rowCount());
  102. model.setData(row, 0, boost::any(d));
  103. model.setData(row, 1, boost::any(row * 10));
  104. d = d.addDays(1);
  105. row++;
  106. }
  107. plotTimeSeriesChart(&model, "days.svg", DateScale);
  108. }
  109. BOOST_AUTO_TEST_CASE( chart_test_WDateTimeChartWeeks )
  110. {
  111. WStandardItemModel model;
  112. WDate start(2009, 10, 1);
  113. WDate end(2009, 11, 1);
  114. WDate d = start;
  115. int row = 0;
  116. model.insertColumns(0, 2);
  117. while (d < end) {
  118. model.insertRow(model.rowCount());
  119. model.setData(row, 0, boost::any(d));
  120. model.setData(row, 1, boost::any(row * 10));
  121. d = d.addDays(1);
  122. row++;
  123. }
  124. plotTimeSeriesChart(&model, "weeks.svg", DateScale);
  125. }
  126. BOOST_AUTO_TEST_CASE( chart_test_WDateTimeChartMonths )
  127. {
  128. WStandardItemModel model;
  129. WDate start(2008, 4, 1);
  130. WDate end(2008, 12, 1);
  131. WDate d = start;
  132. int row = 0;
  133. model.insertColumns(0, 2);
  134. while (d < end) {
  135. model.insertRow(model.rowCount());
  136. model.setData(row, 0, boost::any(d));
  137. model.setData(row, 1, boost::any(row * 10));
  138. d = d.addDays(5);
  139. row++;
  140. }
  141. plotTimeSeriesChart(&model, "months.svg", DateScale);
  142. }
  143. BOOST_AUTO_TEST_CASE( chart_test_WDateTimeChart0Range )
  144. {
  145. WStandardItemModel model;
  146. WDate start(2008, 4, 1);
  147. WDate end(2008, 12, 1);
  148. WDate d = start;
  149. int row = 0;
  150. model.insertColumns(0, 2);
  151. while (d < end) {
  152. model.insertRow(model.rowCount());
  153. model.setData(row, 0, boost::any(d));
  154. model.setData(row, 1, boost::any(20));
  155. d = d.addDays(5);
  156. row++;
  157. }
  158. double range = plotTimeSeriesChart(&model, "0range.svg", DateScale);
  159. BOOST_REQUIRE(range == 90);
  160. }