PageRenderTime 137ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/test/System.Web.Helpers.Test/ChartTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 653 lines | 535 code | 78 blank | 40 comment | 2 complexity | fa99bf8f4e460aa9479173ed99e8a54c MD5 | raw file
  1. using System.Collections;
  2. using System.Drawing;
  3. using System.IO;
  4. using System.Web.Hosting;
  5. using System.Web.UI.DataVisualization.Charting;
  6. using Moq;
  7. using Xunit;
  8. using Assert = Microsoft.TestCommon.AssertEx;
  9. namespace System.Web.Helpers.Test
  10. {
  11. public class ChartTest
  12. {
  13. private byte[] _writeData;
  14. public ChartTest()
  15. {
  16. _writeData = null;
  17. }
  18. [Fact]
  19. public void BuildChartAddsDefaultArea()
  20. {
  21. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  22. AssertBuiltChartAction(chart, c =>
  23. {
  24. Assert.Equal(1, c.ChartAreas.Count);
  25. Assert.Equal("Default", c.ChartAreas[0].Name);
  26. });
  27. }
  28. [Fact]
  29. public void XAxisOverrides()
  30. {
  31. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100)
  32. .SetXAxis("AxisX", 1, 100);
  33. AssertBuiltChartAction(chart, c =>
  34. {
  35. Assert.Equal(1, c.ChartAreas.Count);
  36. Assert.Equal("AxisX", c.ChartAreas[0].AxisX.Title);
  37. Assert.Equal(1, c.ChartAreas[0].AxisX.Minimum);
  38. Assert.Equal(100, c.ChartAreas[0].AxisX.Maximum);
  39. });
  40. }
  41. [Fact]
  42. public void YAxisOverrides()
  43. {
  44. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100)
  45. .SetYAxis("AxisY", 1, 100);
  46. AssertBuiltChartAction(chart, c =>
  47. {
  48. Assert.Equal(1, c.ChartAreas.Count);
  49. Assert.Equal("AxisY", c.ChartAreas[0].AxisY.Title);
  50. Assert.Equal(1, c.ChartAreas[0].AxisY.Minimum);
  51. Assert.Equal(100, c.ChartAreas[0].AxisY.Maximum);
  52. });
  53. }
  54. [Fact]
  55. public void ConstructorLoadsTemplate()
  56. {
  57. var template = WriteTemplate(@"<Chart BorderWidth=""2""></Chart>");
  58. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, themePath: template);
  59. AssertBuiltChartAction(chart, c => { Assert.Equal(2, c.BorderWidth); });
  60. }
  61. [Fact]
  62. public void ConstructorLoadsTheme()
  63. {
  64. //Vanilla theme
  65. /*
  66. * <Chart Palette="SemiTransparent" BorderColor="#000" BorderWidth="2" BorderlineDashStyle="Solid">
  67. <ChartAreas>
  68. <ChartArea _Template_="All" Name="Default">
  69. <AxisX>
  70. <MinorGrid Enabled="False" />
  71. <MajorGrid Enabled="False" />
  72. </AxisX>
  73. <AxisY>
  74. <MajorGrid Enabled="False" />
  75. <MinorGrid Enabled="False" />
  76. </AxisY>
  77. </ChartArea>
  78. </ChartAreas>
  79. </Chart>
  80. */
  81. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, theme: ChartTheme.Vanilla);
  82. AssertBuiltChartAction(chart, c =>
  83. {
  84. Assert.Equal(c.Palette, ChartColorPalette.SemiTransparent);
  85. Assert.Equal(c.BorderColor, Color.FromArgb(0, Color.Black));
  86. Assert.Equal(1, c.ChartAreas.Count);
  87. Assert.False(c.ChartAreas[0].AxisX.MajorGrid.Enabled);
  88. Assert.False(c.ChartAreas[0].AxisY.MinorGrid.Enabled);
  89. });
  90. }
  91. [Fact]
  92. public void ConstructorLoadsThemeAndTemplate()
  93. {
  94. //Vanilla theme
  95. /*
  96. * <Chart Palette="SemiTransparent" BorderColor="#000" BorderWidth="2" BorderlineDashStyle="Solid">
  97. <ChartAreas>
  98. <ChartArea _Template_="All" Name="Default">
  99. <AxisX>
  100. <MinorGrid Enabled="False" />
  101. <MajorGrid Enabled="False" />
  102. </AxisX>
  103. <AxisY>
  104. <MajorGrid Enabled="False" />
  105. <MinorGrid Enabled="False" />
  106. </AxisY>
  107. </ChartArea>
  108. </ChartAreas>
  109. </Chart>
  110. */
  111. var template = WriteTemplate(@"<Chart BorderlineDashStyle=""DashDot""><Legends><Legend BackColor=""Red"" /></Legends></Chart>");
  112. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, theme: ChartTheme.Vanilla, themePath: template);
  113. AssertBuiltChartAction(chart, c =>
  114. {
  115. Assert.Equal(c.Palette, ChartColorPalette.SemiTransparent);
  116. Assert.Equal(c.BorderColor, Color.FromArgb(0, Color.Black));
  117. Assert.Equal(c.BorderlineDashStyle, ChartDashStyle.DashDot);
  118. Assert.Equal(1, c.ChartAreas.Count);
  119. Assert.Equal(c.Legends.Count, 1);
  120. Assert.Equal(c.Legends[0].BackColor, Color.Red);
  121. Assert.False(c.ChartAreas[0].AxisX.MajorGrid.Enabled);
  122. Assert.False(c.ChartAreas[0].AxisY.MinorGrid.Enabled);
  123. });
  124. }
  125. [Fact]
  126. public void ConstructorSetsWidthAndHeight()
  127. {
  128. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 101, 102);
  129. Assert.Equal(101, chart.Width);
  130. Assert.Equal(102, chart.Height);
  131. AssertBuiltChartAction(chart, c =>
  132. {
  133. Assert.Equal(101, c.Width);
  134. Assert.Equal(102, c.Height);
  135. });
  136. }
  137. [Fact]
  138. public void ConstructorThrowsWhenHeightIsLessThanZero()
  139. {
  140. Assert.ThrowsArgumentOutOfRange(() => { new Chart(GetContext(), GetVirtualPathProvider(), 100, -1); }, "height", "Value must be greater than or equal to 0.");
  141. }
  142. [Fact]
  143. public void ConstructorThrowsWhenTemplateNotFound()
  144. {
  145. var templateFile = @"FileNotFound.xml";
  146. Assert.ThrowsArgument(() => { new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, themePath: templateFile); },
  147. "themePath",
  148. String.Format("The theme file \"{0}\" could not be found.", VirtualPathUtility.Combine(GetContext().Request.AppRelativeCurrentExecutionFilePath, templateFile)));
  149. }
  150. [Fact]
  151. public void ConstructorThrowsWhenWidthIsLessThanZero()
  152. {
  153. Assert.ThrowsArgumentOutOfRange(() => { new Chart(GetContext(), GetVirtualPathProvider(), -1, 100); }, "width", "Value must be greater than or equal to 0.");
  154. }
  155. [Fact]
  156. public void DataBindCrossTable()
  157. {
  158. var data = new[]
  159. {
  160. new { GroupBy = "1", YValue = 1 },
  161. new { GroupBy = "1", YValue = 2 },
  162. new { GroupBy = "2", YValue = 1 }
  163. };
  164. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100)
  165. .DataBindCrossTable(data, "GroupBy", xField: null, yFields: "YValue");
  166. // todo - anything else to verify here?
  167. AssertBuiltChartAction(chart, c =>
  168. {
  169. Assert.Equal(2, c.Series.Count);
  170. Assert.Equal(2, c.Series[0].Points.Count);
  171. Assert.Equal(1, c.Series[1].Points.Count);
  172. });
  173. }
  174. [Fact]
  175. public void DataBindCrossTableThrowsWhenDataSourceIsNull()
  176. {
  177. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  178. Assert.ThrowsArgumentNull(() => { chart.DataBindCrossTable(null, "GroupBy", xField: null, yFields: "yFields"); }, "dataSource");
  179. }
  180. [Fact]
  181. public void DataBindCrossTableThrowsWhenDataSourceIsString()
  182. {
  183. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  184. Assert.ThrowsArgument(() => { chart.DataBindCrossTable("DataSource", "GroupBy", xField: null, yFields: "yFields"); }, "dataSource", "A series cannot be data-bound to a string object.");
  185. }
  186. [Fact]
  187. public void DataBindCrossTableThrowsWhenGroupByIsNull()
  188. {
  189. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  190. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.DataBindCrossTable(new object[0], null, xField: null, yFields: "yFields"); }, "groupByField");
  191. }
  192. [Fact]
  193. public void DataBindCrossTableThrowsWhenGroupByIsEmpty()
  194. {
  195. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  196. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.DataBindCrossTable(new object[0], "", xField: null, yFields: "yFields"); }, "groupByField");
  197. }
  198. [Fact]
  199. public void DataBindCrossTableThrowsWhenYFieldsIsNull()
  200. {
  201. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  202. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.DataBindCrossTable(new object[0], "GroupBy", xField: null, yFields: null); }, "yFields");
  203. }
  204. [Fact]
  205. public void DataBindCrossTableThrowsWhenYFieldsIsEmpty()
  206. {
  207. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  208. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.DataBindCrossTable(new object[0], "GroupBy", xField: null, yFields: ""); }, "yFields");
  209. }
  210. [Fact]
  211. public void DataBindTable()
  212. {
  213. var data = new[]
  214. {
  215. new { XValue = "1", YValue = 1 },
  216. new { XValue = "2", YValue = 2 },
  217. new { XValue = "3", YValue = 3 }
  218. };
  219. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100)
  220. .DataBindTable(data, xField: "XValue");
  221. // todo - anything else to verify here?
  222. AssertBuiltChartAction(chart, c =>
  223. {
  224. Assert.Equal(1, c.Series.Count);
  225. Assert.Equal(3, c.Series[0].Points.Count);
  226. });
  227. }
  228. [Fact]
  229. public void DataBindTableWhenXFieldIsNull()
  230. {
  231. var data = new[]
  232. {
  233. new { YValue = 1 },
  234. new { YValue = 2 },
  235. new { YValue = 3 }
  236. };
  237. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100)
  238. .DataBindTable(data, xField: null);
  239. // todo - anything else to verify here?
  240. AssertBuiltChartAction(chart, c =>
  241. {
  242. Assert.Equal(1, c.Series.Count);
  243. Assert.Equal(3, c.Series[0].Points.Count);
  244. });
  245. }
  246. [Fact]
  247. public void DataBindTableThrowsWhenDataSourceIsNull()
  248. {
  249. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  250. Assert.ThrowsArgumentNull(() => { chart.DataBindTable(null); }, "dataSource");
  251. }
  252. [Fact]
  253. public void DataBindTableThrowsWhenDataSourceIsString()
  254. {
  255. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  256. Assert.ThrowsArgument(() => { chart.DataBindTable(""); }, "dataSource", "A series cannot be data-bound to a string object.");
  257. }
  258. [Fact]
  259. public void GetBytesReturnsNonEmptyArray()
  260. {
  261. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  262. Assert.True(chart.GetBytes().Length > 0);
  263. }
  264. [Fact]
  265. public void GetBytesThrowsWhenFormatIsEmpty()
  266. {
  267. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  268. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.GetBytes(format: String.Empty); }, "format");
  269. }
  270. [Fact]
  271. public void GetBytesThrowsWhenFormatIsInvalid()
  272. {
  273. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  274. Assert.ThrowsArgument(() => { chart.GetBytes(format: "foo"); }, "format", "\"foo\" is invalid image format. Valid values are image format names like: \"JPEG\", \"BMP\", \"GIF\", \"PNG\", etc.");
  275. }
  276. [Fact]
  277. public void GetBytesThrowsWhenFormatIsNull()
  278. {
  279. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  280. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.GetBytes(format: null); }, "format");
  281. }
  282. [Fact]
  283. public void LegendDefaults()
  284. {
  285. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100).AddLegend();
  286. AssertBuiltChartAction(chart, c =>
  287. {
  288. Assert.Equal(1, c.Legends.Count);
  289. // NOTE: Chart.Legends.Add will create default name
  290. Assert.Equal("Legend1", c.Legends[0].Name);
  291. Assert.Equal(1, c.Legends[0].BorderWidth);
  292. });
  293. }
  294. [Fact]
  295. public void LegendOverrides()
  296. {
  297. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100).AddLegend("Legend1")
  298. .AddLegend("Legend2", "Legend2Name");
  299. AssertBuiltChartAction(chart, c =>
  300. {
  301. Assert.Equal(2, c.Legends.Count);
  302. Assert.Equal("Legend1", c.Legends[0].Name);
  303. Assert.Equal("Legend2", c.Legends[1].Title);
  304. Assert.Equal("Legend2Name", c.Legends[1].Name);
  305. });
  306. }
  307. [Fact]
  308. public void SaveAndWriteFromCache()
  309. {
  310. var context1 = GetContext();
  311. var chart = new Chart(context1, GetVirtualPathProvider(), 100, 100);
  312. string key = chart.SaveToCache();
  313. Assert.Equal(chart, WebCache.Get(key));
  314. var context2 = GetContext();
  315. Assert.Equal(chart, Chart.GetFromCache(context2, key));
  316. Chart.WriteFromCache(context2, key);
  317. Assert.Null(context1.Response.ContentType);
  318. Assert.Equal("image/jpeg", context2.Response.ContentType);
  319. }
  320. [Fact]
  321. public void SaveThrowsWhenFormatIsEmpty()
  322. {
  323. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  324. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.Save(GetContext(), "chartPath", format: String.Empty); }, "format");
  325. }
  326. [Fact]
  327. public void SaveWorksWhenFormatIsJPG()
  328. {
  329. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  330. string fileName = "chartPath";
  331. chart.Save(GetContext(), "chartPath", format: "jpg");
  332. byte[] a = File.ReadAllBytes(fileName);
  333. chart.Save(GetContext(), "chartPath", format: "jpeg");
  334. byte[] b = File.ReadAllBytes(fileName);
  335. Assert.Equal(a, b);
  336. }
  337. [Fact]
  338. public void SaveThrowsWhenFormatIsInvalid()
  339. {
  340. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  341. Assert.ThrowsArgument(() => { chart.Save(GetContext(), "chartPath", format: "foo"); }, "format", "\"foo\" is invalid image format. Valid values are image format names like: \"JPEG\", \"BMP\", \"GIF\", \"PNG\", etc.");
  342. }
  343. [Fact]
  344. public void SaveThrowsWhenFormatIsNull()
  345. {
  346. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  347. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.Save(GetContext(), "chartPath", format: null); }, "format");
  348. }
  349. [Fact]
  350. public void SaveThrowsWhenPathIsEmpty()
  351. {
  352. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  353. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.Save(GetContext(), path: String.Empty, format: "jpeg"); }, "path");
  354. }
  355. [Fact]
  356. public void SaveThrowsWhenPathIsNull()
  357. {
  358. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  359. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.Save(GetContext(), path: null, format: "jpeg"); }, "path");
  360. }
  361. [Fact]
  362. public void SaveWritesToFile()
  363. {
  364. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  365. chart.Save(GetContext(), "SaveWritesToFile.jpg", format: "image/jpeg");
  366. Assert.Equal("SaveWritesToFile.jpg", Path.GetFileName(chart.FileName));
  367. Assert.True(File.Exists(chart.FileName));
  368. }
  369. [Fact]
  370. public void SaveXmlThrowsWhenPathIsEmpty()
  371. {
  372. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  373. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.SaveXml(GetContext(), String.Empty); }, "path");
  374. }
  375. [Fact]
  376. public void SaveXmlThrowsWhenPathIsNull()
  377. {
  378. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  379. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.SaveXml(GetContext(), null); }, "path");
  380. }
  381. [Fact]
  382. public void SaveXmlWritesToFile()
  383. {
  384. var template = WriteTemplate(@"<Chart BorderWidth=""2""></Chart>");
  385. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, themePath: template);
  386. chart.SaveXml(GetContext(), "SaveXmlWritesToFile.xml");
  387. Assert.True(File.Exists("SaveXmlWritesToFile.xml"));
  388. string result = File.ReadAllText("SaveXmlWritesToFile.xml");
  389. Assert.True(result.Contains("BorderWidth=\"2\""));
  390. }
  391. [Fact]
  392. public void TemplateWithCommentsDoesNotThrow()
  393. {
  394. var template = WriteTemplate(@"<Chart BorderWidth=""2""><!-- This is a XML comment. --> </Chart>");
  395. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, themePath: template);
  396. Assert.NotNull(chart.ToWebImage());
  397. }
  398. [Fact]
  399. public void TemplateWithIncorrectPropertiesThrows()
  400. {
  401. var template = WriteTemplate(@"<Chart borderWidth=""2""><fjkjkgjklfg /></Chart>");
  402. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100, themePath: template);
  403. Assert.Throws<InvalidOperationException>(() => chart.ToWebImage(),
  404. "Cannot deserialize property. Unknown property name 'borderWidth' in object \" System.Web.UI.DataVisualization.Charting.Chart");
  405. }
  406. [Fact]
  407. public void WriteWorksWithJPGFormat()
  408. {
  409. var response = new Mock<HttpResponseBase>();
  410. var stream = new MemoryStream();
  411. response.Setup(c => c.Output).Returns(new StreamWriter(stream));
  412. var context = new Mock<HttpContextBase>();
  413. context.Setup(c => c.Response).Returns(response.Object);
  414. var chart = new Chart(context.Object, GetVirtualPathProvider(), 100, 100);
  415. chart.Write("jpeg");
  416. byte[] a = stream.GetBuffer();
  417. stream.SetLength(0);
  418. chart.Write("jpg");
  419. byte[] b = stream.GetBuffer();
  420. Assert.Equal(a, b);
  421. }
  422. [Fact]
  423. public void WriteThrowsWithInvalidFormat()
  424. {
  425. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  426. Assert.ThrowsArgument(() => chart.Write("foo"),
  427. "format", "\"foo\" is invalid image format. Valid values are image format names like: \"JPEG\", \"BMP\", \"GIF\", \"PNG\", etc.");
  428. }
  429. [Fact]
  430. public void SeriesOverrides()
  431. {
  432. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100)
  433. .AddSeries(chartType: "Bar");
  434. AssertBuiltChartAction(chart, c =>
  435. {
  436. Assert.Equal(1, c.Series.Count);
  437. Assert.Equal(SeriesChartType.Bar, c.Series[0].ChartType);
  438. });
  439. }
  440. [Fact]
  441. public void SeriesThrowsWhenChartTypeIsEmpty()
  442. {
  443. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  444. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.AddSeries(chartType: ""); }, "chartType");
  445. }
  446. [Fact]
  447. public void SeriesThrowsWhenChartTypeIsNull()
  448. {
  449. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  450. Assert.ThrowsArgumentNullOrEmptyString(() => { chart.AddSeries(chartType: null); }, "chartType");
  451. }
  452. [Fact]
  453. public void TitleDefaults()
  454. {
  455. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100).AddTitle();
  456. AssertBuiltChartAction(chart, c =>
  457. {
  458. Assert.Equal(1, c.Titles.Count);
  459. // NOTE: Chart.Titles.Add will create default name
  460. Assert.Equal("Title1", c.Titles[0].Name);
  461. Assert.Equal(String.Empty, c.Titles[0].Text);
  462. Assert.Equal(1, c.Titles[0].BorderWidth);
  463. });
  464. }
  465. [Fact]
  466. public void TitleOverrides()
  467. {
  468. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100).AddTitle(name: "Title1")
  469. .AddTitle("Title2Text", name: "Title2");
  470. AssertBuiltChartAction(chart, c =>
  471. {
  472. Assert.Equal(2, c.Titles.Count);
  473. Assert.Equal("Title1", c.Titles[0].Name);
  474. Assert.Equal("Title2", c.Titles[1].Name);
  475. Assert.Equal("Title2Text", c.Titles[1].Text);
  476. });
  477. }
  478. [Fact]
  479. public void ToWebImage()
  480. {
  481. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  482. var image = chart.ToWebImage();
  483. Assert.NotNull(image);
  484. Assert.Equal("jpeg", image.ImageFormat);
  485. }
  486. [Fact]
  487. public void ToWebImageUsesFormat()
  488. {
  489. var chart = new Chart(GetContext(), GetVirtualPathProvider(), 100, 100);
  490. var image = chart.ToWebImage(format: "png");
  491. Assert.NotNull(image);
  492. Assert.Equal("png", image.ImageFormat);
  493. }
  494. [Fact]
  495. public void WriteFromCacheIsNoOpIfNotSavedInCache()
  496. {
  497. var context = GetContext();
  498. Assert.Null(Chart.WriteFromCache(context, Guid.NewGuid().ToString()));
  499. Assert.Null(context.Response.ContentType);
  500. }
  501. [Fact]
  502. public void WriteUpdatesResponse()
  503. {
  504. var context = GetContext();
  505. var chart = new Chart(context, GetVirtualPathProvider(), 100, 100);
  506. chart.Write();
  507. Assert.Equal("", context.Response.Charset);
  508. Assert.Equal("image/jpeg", context.Response.ContentType);
  509. Assert.True((_writeData != null) && (_writeData.Length > 0));
  510. }
  511. private void AssertBuiltChartAction(Chart chart, Action<UI.DataVisualization.Charting.Chart> action)
  512. {
  513. bool actionCalled = false;
  514. chart.ExecuteChartAction(c =>
  515. {
  516. action(c);
  517. actionCalled = true;
  518. });
  519. Assert.True(actionCalled);
  520. }
  521. private HttpContextBase GetContext()
  522. {
  523. // Strip drive letter for VirtualPathUtility.Combine
  524. var testPath = Directory.GetCurrentDirectory().Substring(2) + "/Out";
  525. Mock<HttpRequestBase> request = new Mock<HttpRequestBase>();
  526. request.Setup(r => r.AppRelativeCurrentExecutionFilePath).Returns(testPath);
  527. request.Setup(r => r.MapPath(It.IsAny<string>())).Returns((string path) => path);
  528. Mock<HttpResponseBase> response = new Mock<HttpResponseBase>();
  529. response.SetupProperty(r => r.ContentType);
  530. response.SetupProperty(r => r.Charset);
  531. response.Setup(r => r.BinaryWrite(It.IsAny<byte[]>())).Callback((byte[] data) => _writeData = data);
  532. Mock<HttpServerUtilityBase> server = new Mock<HttpServerUtilityBase>();
  533. server.Setup(s => s.MapPath(It.IsAny<string>())).Returns((string s) => s);
  534. var items = new Hashtable();
  535. Mock<HttpContextBase> context = new Mock<HttpContextBase>();
  536. context.Setup(c => c.Request).Returns(request.Object);
  537. context.Setup(c => c.Response).Returns(response.Object);
  538. context.Setup(c => c.Server).Returns(server.Object);
  539. context.Setup(c => c.Items).Returns(items);
  540. return context.Object;
  541. }
  542. private string WriteTemplate(string xml)
  543. {
  544. var path = Guid.NewGuid() + ".xml";
  545. File.WriteAllText(path, xml);
  546. return path;
  547. }
  548. private MockVirtualPathProvider GetVirtualPathProvider()
  549. {
  550. return new MockVirtualPathProvider();
  551. }
  552. class MockVirtualPathProvider : VirtualPathProvider
  553. {
  554. class MockVirtualFile : VirtualFile
  555. {
  556. public MockVirtualFile(string virtualPath)
  557. : base(virtualPath)
  558. {
  559. }
  560. public override Stream Open()
  561. {
  562. return File.Open(this.VirtualPath, FileMode.Open);
  563. }
  564. }
  565. public override bool FileExists(string virtualPath)
  566. {
  567. return File.Exists(virtualPath);
  568. }
  569. public override VirtualFile GetFile(string virtualPath)
  570. {
  571. return new MockVirtualFile(virtualPath);
  572. }
  573. }
  574. }
  575. }