PageRenderTime 35ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://bitbucket.org/mdavid/aspnetwebstack
C# | 1249 lines | 1145 code | 93 blank | 11 comment | 3 complexity | 1d405305e5e77150ca5668031a84b159 MD5 | raw file
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Dynamic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Web.TestUtil;
  8. using System.Web.WebPages;
  9. using Microsoft.TestCommon;
  10. using Moq;
  11. using Xunit;
  12. using Assert = Microsoft.TestCommon.AssertEx;
  13. namespace System.Web.Helpers.Test
  14. {
  15. public class WebGridTest
  16. {
  17. [Fact]
  18. public void AjaxCheckedOnlyOnce()
  19. {
  20. var grid = new WebGrid(GetContext(), ajaxUpdateContainerId: "grid")
  21. .Bind(new[] { new { First = "First", Second = "Second" } });
  22. string html = grid.Table().ToString();
  23. Assert.True(html.Contains("<script"));
  24. html = grid.Table().ToString();
  25. Assert.False(html.Contains("<script"));
  26. html = grid.Pager().ToString();
  27. Assert.False(html.Contains("<script"));
  28. }
  29. [Fact]
  30. public void AjaxCallbackIgnoredIfAjaxUpdateContainerIdIsNotSet()
  31. {
  32. var grid = new WebGrid(GetContext(), ajaxUpdateCallback: "myCallback")
  33. .Bind(new[] { new { First = "First", Second = "Second" } });
  34. string html = grid.Table().ToString();
  35. Assert.False(html.Contains("<script"));
  36. Assert.False(html.Contains("myCallback"));
  37. }
  38. [Fact]
  39. public void ColumnNameDefaultsExcludesIndexedProperties()
  40. {
  41. var grid = new WebGrid(GetContext()).Bind(new[] { "First", "Second" });
  42. Assert.Equal(1, grid.ColumnNames.Count());
  43. Assert.True(grid.ColumnNames.Contains("Length"));
  44. }
  45. [Fact]
  46. public void ColumnNameDefaultsForDynamics()
  47. {
  48. var grid = new WebGrid(GetContext()).Bind(Dynamics(new { First = "First", Second = "Second" }));
  49. Assert.Equal(2, grid.ColumnNames.Count());
  50. Assert.True(grid.ColumnNames.Contains("First"));
  51. Assert.True(grid.ColumnNames.Contains("Second"));
  52. }
  53. [Fact]
  54. public void ColumnNameDefaultsForNonDynamics()
  55. {
  56. var grid = new WebGrid(GetContext()).Bind(new[] { new { First = "First", Second = "Second" } });
  57. Assert.Equal(2, grid.ColumnNames.Count());
  58. Assert.True(grid.ColumnNames.Contains("First"));
  59. Assert.True(grid.ColumnNames.Contains("Second"));
  60. }
  61. [Fact]
  62. public void ColumnNameDefaultsSupportsBindableTypes()
  63. {
  64. var grid = new WebGrid(GetContext()).Bind(new[]
  65. {
  66. new
  67. {
  68. DateTime = DateTime.MinValue,
  69. DateTimeOffset = DateTimeOffset.MinValue,
  70. Decimal = Decimal.MinValue,
  71. Guid = Guid.Empty,
  72. Int32 = 1,
  73. NullableInt32 = (int?)1,
  74. Object = new object(),
  75. Projection = new { Foo = "Bar" },
  76. TimeSpan = TimeSpan.MinValue
  77. }
  78. });
  79. Assert.Equal(7, grid.ColumnNames.Count());
  80. Assert.True(grid.ColumnNames.Contains("DateTime"));
  81. Assert.True(grid.ColumnNames.Contains("DateTimeOffset"));
  82. Assert.True(grid.ColumnNames.Contains("Decimal"));
  83. Assert.True(grid.ColumnNames.Contains("Guid"));
  84. Assert.True(grid.ColumnNames.Contains("Int32"));
  85. Assert.True(grid.ColumnNames.Contains("NullableInt32"));
  86. Assert.True(grid.ColumnNames.Contains("TimeSpan"));
  87. Assert.False(grid.ColumnNames.Contains("Object"));
  88. Assert.False(grid.ColumnNames.Contains("Projection"));
  89. }
  90. [Fact]
  91. public void ColumnsIsNoOp()
  92. {
  93. var grid = new WebGrid(GetContext()).Bind(new[]
  94. {
  95. new { First = "First", Second = "Second" }
  96. });
  97. var columns = new[]
  98. {
  99. grid.Column("First"), grid.Column("Second")
  100. };
  101. Assert.Equal(columns, grid.Columns(columns));
  102. }
  103. [Fact]
  104. public void ColumnThrowsIfColumnNameIsEmptyAndNoFormat()
  105. {
  106. var grid = new WebGrid(GetContext()).Bind(new object[0]);
  107. Assert.ThrowsArgument(() => { grid.Column(columnName: String.Empty, format: null); }, "columnName", "The column name cannot be null or an empty string unless a custom format is specified.");
  108. }
  109. [Fact]
  110. public void ColumnThrowsIfColumnNameIsNullAndNoFormat()
  111. {
  112. var grid = new WebGrid(GetContext()).Bind(new object[0]);
  113. Assert.ThrowsArgument(() => { grid.Column(columnName: null, format: null); }, "columnName", "The column name cannot be null or an empty string unless a custom format is specified.");
  114. }
  115. [Fact]
  116. public void BindThrowsIfSourceIsNull()
  117. {
  118. Assert.ThrowsArgumentNull(() => { new WebGrid(GetContext()).Bind(null); }, "source");
  119. }
  120. [Fact]
  121. public void ConstructorThrowsIfRowsPerPageIsLessThanOne()
  122. {
  123. Assert.ThrowsArgumentOutOfRange(() => { new WebGrid(GetContext(), rowsPerPage: 0); }, "rowsPerPage", "Value must be greater than or equal to 1.", allowDerivedExceptions: true);
  124. }
  125. [Fact]
  126. public void GetHtmlDefaults()
  127. {
  128. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  129. .Bind(new[]
  130. {
  131. new { P1 = 1, P2 = '2', P3 = "3" },
  132. new { P1 = 4, P2 = '5', P3 = "6" }
  133. });
  134. var html = grid.GetHtml();
  135. UnitTestHelper.AssertEqualsIgnoreWhitespace(
  136. "<table><thead><tr>" +
  137. "<th scope=\"col\"><a href=\"?sort=P1&amp;sortdir=ASC\">P1</a></th>" +
  138. "<th scope=\"col\"><a href=\"?sort=P2&amp;sortdir=ASC\">P2</a></th>" +
  139. "<th scope=\"col\"><a href=\"?sort=P3&amp;sortdir=ASC\">P3</a></th>" +
  140. "</tr></thead>" +
  141. "<tfoot><tr>" +
  142. "<td colspan=\"3\">1 <a href=\"?page=2\">2</a> <a href=\"?page=2\">&gt;</a> </td>" +
  143. "</tr></tfoot>" +
  144. "<tbody><tr><td>1</td><td>2</td><td>3</td></tr></tbody>" +
  145. "</table>", html.ToString());
  146. XhtmlAssert.Validate1_1(html);
  147. }
  148. [Fact]
  149. public void WebGridProducesValidHtmlWhenSummaryIsSpecified()
  150. {
  151. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  152. .Bind(new[]
  153. {
  154. new { P1 = 1, P2 = '2', P3 = "3" },
  155. new { P1 = 4, P2 = '5', P3 = "6" }
  156. });
  157. var caption = "WebGrid With Caption";
  158. var html = grid.GetHtml(caption: caption);
  159. UnitTestHelper.AssertEqualsIgnoreWhitespace(
  160. "<table>" +
  161. "<caption>" + caption + "</caption>" +
  162. "<thead><tr>" +
  163. "<th scope=\"col\"><a href=\"?sort=P1&amp;sortdir=ASC\">P1</a></th>" +
  164. "<th scope=\"col\"><a href=\"?sort=P2&amp;sortdir=ASC\">P2</a></th>" +
  165. "<th scope=\"col\"><a href=\"?sort=P3&amp;sortdir=ASC\">P3</a></th>" +
  166. "</tr></thead>" +
  167. "<tfoot><tr>" +
  168. "<td colspan=\"3\">1 <a href=\"?page=2\">2</a> <a href=\"?page=2\">&gt;</a> </td>" +
  169. "</tr></tfoot>" +
  170. "<tbody><tr><td>1</td><td>2</td><td>3</td></tr></tbody>" +
  171. "</table>", html.ToString());
  172. XhtmlAssert.Validate1_1(html);
  173. }
  174. [Fact]
  175. public void WebGridEncodesCaptionText()
  176. {
  177. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  178. .Bind(new[]
  179. {
  180. new { P1 = 1, P2 = '2', P3 = "3" },
  181. new { P1 = 4, P2 = '5', P3 = "6" }
  182. });
  183. var caption = "WebGrid <> With Caption";
  184. var html = grid.GetHtml(caption: caption);
  185. UnitTestHelper.AssertEqualsIgnoreWhitespace(
  186. "<table>" +
  187. "<caption>WebGrid &lt;&gt; With Caption</caption>" +
  188. "<thead><tr>" +
  189. "<th scope=\"col\"><a href=\"?sort=P1&amp;sortdir=ASC\">P1</a></th>" +
  190. "<th scope=\"col\"><a href=\"?sort=P2&amp;sortdir=ASC\">P2</a></th>" +
  191. "<th scope=\"col\"><a href=\"?sort=P3&amp;sortdir=ASC\">P3</a></th>" +
  192. "</tr></thead>" +
  193. "<tfoot><tr>" +
  194. "<td colspan=\"3\">1 <a href=\"?page=2\">2</a> <a href=\"?page=2\">&gt;</a> </td>" +
  195. "</tr></tfoot>" +
  196. "<tbody><tr><td>1</td><td>2</td><td>3</td></tr></tbody>" +
  197. "</table>", html.ToString());
  198. XhtmlAssert.Validate1_1(html);
  199. }
  200. [Fact]
  201. public void GetHtmlWhenPageCountIsOne()
  202. {
  203. var grid = new WebGrid(GetContext())
  204. .Bind(new[]
  205. {
  206. new { P1 = 1, P2 = '2', P3 = "3" }
  207. });
  208. var html = grid.GetHtml();
  209. UnitTestHelper.AssertEqualsIgnoreWhitespace(
  210. "<table><thead><tr>" +
  211. "<th scope=\"col\"><a href=\"?sort=P1&amp;sortdir=ASC\">P1</a></th>" +
  212. "<th scope=\"col\"><a href=\"?sort=P2&amp;sortdir=ASC\">P2</a></th>" +
  213. "<th scope=\"col\"><a href=\"?sort=P3&amp;sortdir=ASC\">P3</a></th>" +
  214. "</tr></thead>" +
  215. "<tbody><tr><td>1</td><td>2</td><td>3</td></tr></tbody>" +
  216. "</table>", html.ToString());
  217. XhtmlAssert.Validate1_1(html);
  218. }
  219. [Fact]
  220. public void GetHtmlWhenPagingAndSortingAreDisabled()
  221. {
  222. var grid = new WebGrid(GetContext(), rowsPerPage: 1, canPage: false, canSort: false)
  223. .Bind(new[]
  224. {
  225. new { P1 = 1, P2 = '2', P3 = "3" },
  226. new { P1 = 4, P2 = '5', P3 = "6" }
  227. });
  228. var html = grid.GetHtml();
  229. UnitTestHelper.AssertEqualsIgnoreWhitespace(
  230. "<table><thead><tr>" +
  231. "<th scope=\"col\">P1</th>" +
  232. "<th scope=\"col\">P2</th>" +
  233. "<th scope=\"col\">P3</th>" +
  234. "</tr></thead>" +
  235. "<tbody>" +
  236. "<tr><td>1</td><td>2</td><td>3</td></tr>" +
  237. "<tr><td>4</td><td>5</td><td>6</td></tr>" +
  238. "</tbody>" +
  239. "</table>", html.ToString());
  240. XhtmlAssert.Validate1_1(html);
  241. }
  242. [Fact]
  243. public void PageIndexCanBeReset()
  244. {
  245. NameValueCollection queryString = new NameValueCollection();
  246. queryString["page"] = "2";
  247. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  248. .Bind(new[]
  249. {
  250. new { P1 = 1, P2 = '2', P3 = "3" },
  251. new { P1 = 4, P2 = '5', P3 = "6" }
  252. });
  253. Assert.Equal(1, grid.PageIndex);
  254. grid.PageIndex = 0;
  255. Assert.Equal(0, grid.PageIndex);
  256. // verify that selection link has updated page
  257. Assert.Equal("?page=1&row=1", grid.Rows.FirstOrDefault().GetSelectUrl());
  258. }
  259. [Fact]
  260. public void PageIndexCanBeResetToSameValue()
  261. {
  262. NameValueCollection queryString = new NameValueCollection();
  263. queryString["page"] = "2";
  264. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  265. .Bind(new[]
  266. {
  267. new { P1 = 1, P2 = '2', P3 = "3" },
  268. new { P1 = 4, P2 = '5', P3 = "6" }
  269. });
  270. grid.PageIndex = 0;
  271. Assert.Equal(0, grid.PageIndex);
  272. }
  273. [Fact]
  274. public void PageIndexDefaultsToZero()
  275. {
  276. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  277. .Bind(new[]
  278. {
  279. new { P1 = 1, P2 = '2', P3 = "3" },
  280. new { P1 = 4, P2 = '5', P3 = "6" }
  281. });
  282. Assert.Equal(0, grid.PageIndex);
  283. Assert.Equal(1, grid.Rows.Count);
  284. Assert.Equal(1, grid.Rows.First()["P1"]);
  285. }
  286. [Fact]
  287. public void SetPageIndexThrowsExceptionWhenValueIsNegative()
  288. {
  289. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  290. .Bind(new[]
  291. {
  292. new { P1 = 1, P2 = '2', P3 = "3" },
  293. new { P1 = 4, P2 = '5', P3 = "6" }
  294. });
  295. Assert.ThrowsArgumentOutOfRange(() => { grid.PageIndex = -1; }, "value", "Value must be between 0 and 1.");
  296. }
  297. [Fact]
  298. public void SetPageIndexThrowsExceptionWhenValueIsEqualToPageCount()
  299. {
  300. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  301. .Bind(new[]
  302. {
  303. new { P1 = 1, P2 = '2', P3 = "3" },
  304. new { P1 = 4, P2 = '5', P3 = "6" }
  305. });
  306. Assert.ThrowsArgumentOutOfRange(() => { grid.PageIndex = grid.PageCount; }, "value", "Value must be between 0 and 1.");
  307. }
  308. [Fact]
  309. public void SetPageIndexThrowsExceptionWhenValueIsGreaterToPageCount()
  310. {
  311. var grid = new WebGrid(GetContext(), rowsPerPage: 1)
  312. .Bind(new[]
  313. {
  314. new { P1 = 1, P2 = '2', P3 = "3" },
  315. new { P1 = 4, P2 = '5', P3 = "6" }
  316. });
  317. Assert.ThrowsArgumentOutOfRange(() => { grid.PageIndex = grid.PageCount + 1; }, "value", "Value must be between 0 and 1.");
  318. }
  319. [Fact]
  320. public void SetPageIndexThrowsExceptionWhenPagingIsDisabled()
  321. {
  322. var grid = new WebGrid(GetContext(), canPage: false)
  323. .Bind(new[]
  324. {
  325. new { P1 = 1, P2 = '2', P3 = "3" },
  326. new { P1 = 4, P2 = '5', P3 = "6" }
  327. });
  328. Assert.Throws<NotSupportedException>(() => { grid.PageIndex = 1; }, "This operation is not supported when paging is disabled for the \"WebGrid\" object.");
  329. }
  330. [Fact]
  331. public void PageIndexResetsToLastPageWhenQueryStringValueGreaterThanPageCount()
  332. {
  333. NameValueCollection queryString = new NameValueCollection();
  334. queryString["page"] = "3";
  335. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  336. .Bind(new[]
  337. {
  338. new { P1 = 1, P2 = '2', P3 = "3" },
  339. new { P1 = 4, P2 = '5', P3 = "6" }
  340. });
  341. Assert.Equal(1, grid.PageIndex);
  342. Assert.Equal(1, grid.Rows.Count);
  343. Assert.Equal(4, grid.Rows.First()["P1"]);
  344. }
  345. [Fact]
  346. public void PageIndexResetWhenQueryStringValueIsInvalid()
  347. {
  348. NameValueCollection queryString = new NameValueCollection();
  349. queryString["page"] = "NotAnInt";
  350. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  351. .Bind(new[]
  352. {
  353. new { P1 = 1, P2 = '2', P3 = "3" },
  354. new { P1 = 4, P2 = '5', P3 = "6" }
  355. });
  356. Assert.Equal(0, grid.PageIndex);
  357. Assert.Equal(1, grid.Rows.Count);
  358. Assert.Equal(1, grid.Rows.First()["P1"]);
  359. }
  360. [Fact]
  361. public void PageIndexResetWhenQueryStringValueLessThanOne()
  362. {
  363. NameValueCollection queryString = new NameValueCollection();
  364. queryString["page"] = "0";
  365. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  366. .Bind(new[]
  367. {
  368. new { P1 = 1, P2 = '2', P3 = "3" },
  369. new { P1 = 4, P2 = '5', P3 = "6" }
  370. });
  371. Assert.Equal(0, grid.PageIndex);
  372. Assert.Equal(1, grid.Rows.Count);
  373. Assert.Equal(1, grid.Rows.First()["P1"]);
  374. }
  375. [Fact]
  376. public void PageIndexUsesCustomQueryString()
  377. {
  378. NameValueCollection queryString = new NameValueCollection();
  379. queryString["g_pg"] = "2";
  380. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1, fieldNamePrefix: "g_", pageFieldName: "pg")
  381. .Bind(new[]
  382. {
  383. new { P1 = 1, P2 = '2', P3 = "3" },
  384. new { P1 = 4, P2 = '5', P3 = "6" }
  385. });
  386. Assert.Equal(1, grid.PageIndex);
  387. Assert.Equal(1, grid.Rows.Count);
  388. Assert.Equal(4, grid.Rows.First()["P1"]);
  389. }
  390. [Fact]
  391. public void PageIndexUsesQueryString()
  392. {
  393. NameValueCollection queryString = new NameValueCollection();
  394. queryString["page"] = "2";
  395. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  396. .Bind(new[]
  397. {
  398. new { P1 = 1, P2 = '2', P3 = "3" },
  399. new { P1 = 4, P2 = '5', P3 = "6" }
  400. });
  401. Assert.Equal(1, grid.PageIndex);
  402. Assert.Equal(1, grid.Rows.Count);
  403. Assert.Equal(4, grid.Rows.First()["P1"]);
  404. }
  405. [Fact]
  406. public void GetPageCountWhenPagingIsTurnedOn()
  407. {
  408. var grid = new WebGrid(GetContext(), canPage: true, rowsPerPage: 1)
  409. .Bind(new[]
  410. {
  411. new { P1 = 1, P2 = '2', P3 = "3" },
  412. new { P1 = 4, P2 = '5', P3 = "6" }
  413. });
  414. Assert.Equal(2, grid.PageCount);
  415. }
  416. [Fact]
  417. public void GetPageIndexWhenPagingIsTurnedOn()
  418. {
  419. var grid = new WebGrid(GetContext(), canPage: true, rowsPerPage: 1)
  420. .Bind(new[]
  421. {
  422. new { P1 = 1, P2 = '2', P3 = "3" },
  423. new { P1 = 4, P2 = '5', P3 = "6" },
  424. new { P1 = 4, P2 = '5', P3 = "6" },
  425. });
  426. grid.PageIndex = 1;
  427. Assert.Equal(1, grid.PageIndex);
  428. Assert.Equal(3, grid.PageCount);
  429. grid.PageIndex = 2;
  430. Assert.Equal(2, grid.PageIndex);
  431. }
  432. [Fact]
  433. public void GetPageCountWhenPagingIsTurnedOff()
  434. {
  435. var grid = new WebGrid(GetContext(), canPage: false, rowsPerPage: 1)
  436. .Bind(new[]
  437. {
  438. new { P1 = 1, P2 = '2', P3 = "3" },
  439. new { P1 = 4, P2 = '5', P3 = "6" }
  440. });
  441. Assert.Equal(1, grid.PageCount);
  442. }
  443. [Fact]
  444. public void GetPageIndexWhenPagingIsTurnedOff()
  445. {
  446. var grid = new WebGrid(GetContext(), canPage: false, rowsPerPage: 1)
  447. .Bind(new[]
  448. {
  449. new { P1 = 1, P2 = '2', P3 = "3" },
  450. new { P1 = 4, P2 = '5', P3 = "6" },
  451. new { P1 = 4, P2 = '5', P3 = "6" },
  452. });
  453. Assert.Equal(0, grid.PageIndex);
  454. Assert.Equal(1, grid.PageCount);
  455. }
  456. [Fact]
  457. public void PageUrlResetsSelection()
  458. {
  459. NameValueCollection queryString = new NameValueCollection();
  460. queryString["page"] = "0";
  461. queryString["row"] = "0";
  462. queryString["sort"] = "P1";
  463. queryString["sortdir"] = "DESC";
  464. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1)
  465. .Bind(new[]
  466. {
  467. new { P1 = 1, P2 = '2', P3 = "3" },
  468. new { P1 = 4, P2 = '5', P3 = "6" }
  469. });
  470. string url = grid.GetPageUrl(1);
  471. Assert.Equal("?page=2&sort=P1&sortdir=DESC", url);
  472. }
  473. [Fact]
  474. public void PageUrlResetsSelectionForAjax()
  475. {
  476. string expected40 = "$(&quot;#grid-container&quot;).swhgLoad(&quot;?page=2&amp;sort=P1&amp;sortdir=DESC&quot;,&quot;#grid-container&quot;);";
  477. string expected45 = "$(&quot;#grid-container&quot;).swhgLoad(&quot;?page=2\\u0026sort=P1\\u0026sortdir=DESC&quot;,&quot;#grid-container&quot;);";
  478. NameValueCollection queryString = new NameValueCollection();
  479. queryString["page"] = "0";
  480. queryString["row"] = "0";
  481. queryString["sort"] = "P1";
  482. queryString["sortdir"] = "DESC";
  483. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1, ajaxUpdateContainerId: "grid-container")
  484. .Bind(new[]
  485. {
  486. new { P1 = 1, P2 = '2', P3 = "3" },
  487. new { P1 = 4, P2 = '5', P3 = "6" }
  488. });
  489. string html = grid.GetContainerUpdateScript(grid.GetPageUrl(1)).ToString();
  490. // Assert
  491. Assert.Equal(RuntimeEnvironment.IsVersion45Installed ? expected45 : expected40, html);
  492. }
  493. [Fact]
  494. public void PageUrlResetsSelectionForAjaxWithCallback()
  495. {
  496. string expected40 = "$(&quot;#grid&quot;).swhgLoad(&quot;?page=2&amp;sort=P1&amp;sortdir=DESC&quot;,&quot;#grid&quot;,myCallback);";
  497. string expected45 = "$(&quot;#grid&quot;).swhgLoad(&quot;?page=2\\u0026sort=P1\\u0026sortdir=DESC&quot;,&quot;#grid&quot;,myCallback);";
  498. NameValueCollection queryString = new NameValueCollection();
  499. queryString["page"] = "0";
  500. queryString["row"] = "0";
  501. queryString["sort"] = "P1";
  502. queryString["sortdir"] = "DESC";
  503. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1, ajaxUpdateContainerId: "grid", ajaxUpdateCallback: "myCallback")
  504. .Bind(new[]
  505. {
  506. new { P1 = 1, P2 = '2', P3 = "3" },
  507. new { P1 = 4, P2 = '5', P3 = "6" }
  508. });
  509. string html = grid.GetContainerUpdateScript(grid.GetPageUrl(1)).ToString();
  510. // Assert
  511. Assert.Equal(RuntimeEnvironment.IsVersion45Installed ? expected45 : expected40, html);
  512. }
  513. [Fact]
  514. public void PageUrlThrowsIfIndexGreaterThanOrEqualToPageCount()
  515. {
  516. var grid = new WebGrid(GetContext(), rowsPerPage: 1).Bind(new[] { new { }, new { } });
  517. Assert.ThrowsArgumentOutOfRange(() => { grid.GetPageUrl(2); }, "pageIndex", "Value must be between 0 and 1.");
  518. }
  519. [Fact]
  520. public void PageUrlThrowsIfIndexLessThanZero()
  521. {
  522. var grid = new WebGrid(GetContext(), rowsPerPage: 1).Bind(new[] { new { }, new { } });
  523. Assert.ThrowsArgumentOutOfRange(() => { grid.GetPageUrl(-1); }, "pageIndex", "Value must be between 0 and 1.");
  524. }
  525. [Fact]
  526. public void PageUrlThrowsIfPagingIsDisabled()
  527. {
  528. var grid = new WebGrid(GetContext(), rowsPerPage: 1, canPage: false).Bind(new[] { new { }, new { } });
  529. Assert.Throws<NotSupportedException>(() => { grid.GetPageUrl(2); }, "This operation is not supported when paging is disabled for the \"WebGrid\" object.");
  530. }
  531. [Fact]
  532. public void PagerRenderingDefaults()
  533. {
  534. var grid = new WebGrid(GetContext(), rowsPerPage: 1).Bind(new[] { new { }, new { }, new { }, new { } });
  535. var html = grid.Pager();
  536. Assert.Equal(
  537. "1 " +
  538. "<a href=\"?page=2\">2</a> " +
  539. "<a href=\"?page=3\">3</a> " +
  540. "<a href=\"?page=4\">4</a> " +
  541. "<a href=\"?page=2\">&gt;</a> ",
  542. html.ToString());
  543. XhtmlAssert.Validate1_1(html, wrapper: "div");
  544. }
  545. [Fact]
  546. public void PagerRenderingOnFirstShowingAll()
  547. {
  548. var grid = new WebGrid(GetContext(), rowsPerPage: 1).Bind(new[] { new { }, new { }, new { }, new { } });
  549. var html = grid.Pager(WebGridPagerModes.All, numericLinksCount: 5);
  550. Assert.Equal(
  551. "1 " +
  552. "<a href=\"?page=2\">2</a> " +
  553. "<a href=\"?page=3\">3</a> " +
  554. "<a href=\"?page=4\">4</a> " +
  555. "<a href=\"?page=2\">&gt;</a> " +
  556. "<a href=\"?page=4\">&gt;&gt;</a>",
  557. html.ToString());
  558. XhtmlAssert.Validate1_1(html, wrapper: "div");
  559. }
  560. [Fact]
  561. public void PagerRenderingOnNextToLastShowingAll()
  562. {
  563. NameValueCollection queryString = new NameValueCollection();
  564. queryString["page"] = "3";
  565. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  566. {
  567. new { }, new { }, new { }, new { }
  568. });
  569. var html = grid.Pager(WebGridPagerModes.All, numericLinksCount: 4);
  570. Assert.Equal(
  571. "<a href=\"?page=1\">&lt;&lt;</a> " +
  572. "<a href=\"?page=2\">&lt;</a> " +
  573. "<a href=\"?page=1\">1</a> " +
  574. "<a href=\"?page=2\">2</a> " +
  575. "3 " +
  576. "<a href=\"?page=4\">4</a> " +
  577. "<a href=\"?page=4\">&gt;</a> ",
  578. html.ToString());
  579. XhtmlAssert.Validate1_1(html, wrapper: "div");
  580. }
  581. [Fact]
  582. public void PagerRenderingOnMiddleShowingAll()
  583. {
  584. NameValueCollection queryString = new NameValueCollection();
  585. queryString["page"] = "3";
  586. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  587. {
  588. new { }, new { }, new { }, new { }
  589. });
  590. var html = grid.Pager(WebGridPagerModes.All, numericLinksCount: 3);
  591. Assert.Equal(
  592. "<a href=\"?page=1\">&lt;&lt;</a> " +
  593. "<a href=\"?page=2\">&lt;</a> " +
  594. "<a href=\"?page=2\">2</a> " +
  595. "3 " +
  596. "<a href=\"?page=4\">4</a> " +
  597. "<a href=\"?page=4\">&gt;</a> ",
  598. html.ToString());
  599. XhtmlAssert.Validate1_1(html, wrapper: "div");
  600. }
  601. [Fact]
  602. public void PagerRenderingOnSecondHidingFirstLast()
  603. {
  604. NameValueCollection queryString = new NameValueCollection();
  605. queryString["page"] = "2";
  606. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  607. {
  608. new { }, new { }, new { }, new { }
  609. });
  610. var html = grid.Pager(WebGridPagerModes.NextPrevious | WebGridPagerModes.Numeric, numericLinksCount: 2);
  611. Assert.Equal(
  612. "<a href=\"?page=1\">&lt;</a> " +
  613. "2 " +
  614. "<a href=\"?page=3\">3</a> " +
  615. "<a href=\"?page=3\">&gt;</a> ",
  616. html.ToString());
  617. XhtmlAssert.Validate1_1(html, wrapper: "div");
  618. }
  619. [Fact]
  620. public void PagerRenderingOnLastHidingFirstLast()
  621. {
  622. NameValueCollection queryString = new NameValueCollection();
  623. queryString["page"] = "4";
  624. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  625. {
  626. new { }, new { }, new { }, new { }
  627. });
  628. var html = grid.Pager(WebGridPagerModes.NextPrevious | WebGridPagerModes.Numeric, numericLinksCount: 1);
  629. Assert.Equal(
  630. "<a href=\"?page=3\">&lt;</a> " +
  631. "4 ",
  632. html.ToString());
  633. XhtmlAssert.Validate1_1(html, wrapper: "div");
  634. }
  635. [Fact]
  636. public void PagerRenderingOnMiddleHidingNextPrevious()
  637. {
  638. NameValueCollection queryString = new NameValueCollection();
  639. queryString["page"] = "3";
  640. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  641. {
  642. new { }, new { }, new { }, new { }
  643. });
  644. var html = grid.Pager(WebGridPagerModes.FirstLast | WebGridPagerModes.Numeric, numericLinksCount: 0);
  645. Assert.Equal(
  646. "<a href=\"?page=1\">&lt;&lt;</a> ",
  647. html.ToString());
  648. XhtmlAssert.Validate1_1(html, wrapper: "div");
  649. }
  650. [Fact]
  651. public void PagerRenderingOnMiddleWithLinksCountGreaterThanPageCount()
  652. {
  653. NameValueCollection queryString = new NameValueCollection();
  654. queryString["page"] = "3";
  655. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  656. {
  657. new { }, new { }, new { }, new { }
  658. });
  659. var html = grid.Pager(WebGridPagerModes.Numeric, numericLinksCount: 6);
  660. Assert.Equal(
  661. "<a href=\"?page=1\">1</a> " +
  662. "<a href=\"?page=2\">2</a> " +
  663. "3 " +
  664. "<a href=\"?page=4\">4</a> ",
  665. html.ToString());
  666. XhtmlAssert.Validate1_1(html, wrapper: "div");
  667. }
  668. [Fact]
  669. public void PagerRenderingHidingAll()
  670. {
  671. var grid = new WebGrid(GetContext(), rowsPerPage: 2).Bind(new[]
  672. {
  673. new { }, new { }, new { }, new { }
  674. });
  675. var html = grid.Pager(WebGridPagerModes.Numeric, numericLinksCount: 0);
  676. Assert.Equal("", html.ToString());
  677. }
  678. [Fact]
  679. public void PagerRenderingTextOverrides()
  680. {
  681. NameValueCollection queryString = new NameValueCollection();
  682. queryString["page"] = "3";
  683. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1).Bind(new[]
  684. {
  685. new { }, new { }, new { }, new { }, new { }
  686. });
  687. var html = grid.Pager(WebGridPagerModes.FirstLast | WebGridPagerModes.NextPrevious,
  688. firstText: "first", previousText: "previous", nextText: "next", lastText: "last");
  689. Assert.Equal(
  690. "<a href=\"?page=1\">first</a> " +
  691. "<a href=\"?page=2\">previous</a> " +
  692. "<a href=\"?page=4\">next</a> " +
  693. "<a href=\"?page=5\">last</a>",
  694. html.ToString());
  695. XhtmlAssert.Validate1_1(html, wrapper: "div");
  696. }
  697. [Fact]
  698. public void PagerThrowsIfTextSetAndModeNotEnabled()
  699. {
  700. var grid = new WebGrid(GetContext(), rowsPerPage: 1).Bind(new[] { new { }, new { } });
  701. Assert.ThrowsArgument(() => { grid.Pager(firstText: "first"); }, "firstText", "To use this argument, pager mode \"FirstLast\" must be enabled.");
  702. Assert.ThrowsArgument(() => { grid.Pager(mode: WebGridPagerModes.Numeric, previousText: "previous"); }, "previousText", "To use this argument, pager mode \"NextPrevious\" must be enabled.");
  703. Assert.ThrowsArgument(() => { grid.Pager(mode: WebGridPagerModes.Numeric, nextText: "next"); }, "nextText", "To use this argument, pager mode \"NextPrevious\" must be enabled.");
  704. Assert.ThrowsArgument(() => { grid.Pager(lastText: "last"); }, "lastText", "To use this argument, pager mode \"FirstLast\" must be enabled.");
  705. }
  706. [Fact]
  707. public void PagerThrowsIfNumericLinkCountIsLessThanZero()
  708. {
  709. var grid = new WebGrid(GetContext(), rowsPerPage: 1).Bind(new[] { new { }, new { } });
  710. Assert.ThrowsArgumentOutOfRange(() => { grid.Pager(numericLinksCount: -1); }, "numericLinksCount", "Value must be greater than or equal to 0.");
  711. }
  712. [Fact]
  713. public void PagerThrowsIfPagingIsDisabled()
  714. {
  715. var grid = new WebGrid(GetContext(), rowsPerPage: 1, canPage: false).Bind(new[] { new { }, new { } });
  716. Assert.Throws<NotSupportedException>(() => { grid.Pager(); }, "This operation is not supported when paging is disabled for the \"WebGrid\" object.");
  717. }
  718. [Fact]
  719. public void PagerWithAjax()
  720. {
  721. var grid = new WebGrid(GetContext(), rowsPerPage: 1, ajaxUpdateContainerId: "grid")
  722. .Bind(new[]
  723. {
  724. new { P1 = 1, P2 = '2', P3 = "3" },
  725. new { P1 = 4, P2 = '5', P3 = "6" }
  726. });
  727. string html = grid.Pager().ToString();
  728. Assert.True(html.Contains("<script"));
  729. }
  730. [Fact]
  731. public void PagerWithAjaxAndCallback()
  732. {
  733. var grid = new WebGrid(GetContext(), rowsPerPage: 1, ajaxUpdateContainerId: "grid", ajaxUpdateCallback: "myCallback")
  734. .Bind(new[]
  735. {
  736. new { P1 = 1, P2 = '2', P3 = "3" },
  737. new { P1 = 4, P2 = '5', P3 = "6" }
  738. });
  739. string html = grid.Pager().ToString();
  740. Assert.True(html.Contains("<script"));
  741. Assert.True(html.Contains("data-swhgcallback=\"myCallback\""));
  742. }
  743. [Fact]
  744. public void PropertySettersDoNotThrowBeforePagingAndSorting()
  745. {
  746. // test with selection because SelectedIndex getter used to do range checking that caused paging and sorting
  747. NameValueCollection queryString = new NameValueCollection();
  748. queryString["row"] = "1";
  749. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 2).Bind(new[]
  750. {
  751. new { P1 = 1 }, new { P1 = 2 }, new { P1 = 3 }
  752. });
  753. // invoke other WebGrid properties to ensure they don't cause sorting and paging
  754. foreach (var prop in typeof(WebGrid).GetProperties())
  755. {
  756. // exceptions: these do cause sorting and paging
  757. if (prop.Name.Equals("Rows") || prop.Name.Equals("SelectedRow") || prop.Name.Equals("ElementType"))
  758. {
  759. continue;
  760. }
  761. prop.GetValue(grid, null);
  762. }
  763. grid.PageIndex = 1;
  764. grid.SelectedIndex = 0;
  765. grid.SortColumn = "P1";
  766. grid.SortDirection = SortDirection.Descending;
  767. }
  768. [Fact]
  769. public void PropertySettersDoNotThrowAfterPagingAndSortingIfValuesHaveNotChanged()
  770. {
  771. var grid = new WebGrid(GetContext(), rowsPerPage: 2).Bind(new[]
  772. {
  773. new { P1 = 1 }, new { P1 = 2 }, new { P1 = 3 }
  774. });
  775. // calling Rows will sort and page the data
  776. Assert.Equal(2, grid.Rows.Count());
  777. grid.PageIndex = 0;
  778. grid.SelectedIndex = -1;
  779. grid.SortColumn = String.Empty;
  780. grid.SortDirection = SortDirection.Ascending;
  781. }
  782. [Fact]
  783. public void PropertySettersThrowAfterPagingAndSorting()
  784. {
  785. var grid = new WebGrid(GetContext(), rowsPerPage: 2).Bind(new[]
  786. {
  787. new { P1 = 1 }, new { P1 = 2 }, new { P1 = 3 }
  788. });
  789. // calling Rows will sort and page the data
  790. Assert.Equal(2, grid.Rows.Count());
  791. var message = "This property cannot be set after the \"WebGrid\" object has been sorted or paged. Make sure that this property is set prior to invoking the \"Rows\" property directly or indirectly through other methods such as \"GetHtml\", \"Pager\", \"Table\", etc.";
  792. Assert.Throws<InvalidOperationException>(() => { grid.PageIndex = 1; }, message);
  793. Assert.Throws<InvalidOperationException>(() => { grid.SelectedIndex = 0; }, message);
  794. Assert.Throws<InvalidOperationException>(() => { grid.SortColumn = "P1"; }, message);
  795. Assert.Throws<InvalidOperationException>(() => { grid.SortDirection = SortDirection.Descending; }, message);
  796. }
  797. [Fact]
  798. public void RowColumnsAreDynamicMembersForDynamics()
  799. {
  800. var grid = new WebGrid(GetContext()).Bind(Dynamics(
  801. new { P1 = 1, P2 = '2', P3 = "3" }
  802. ));
  803. dynamic row = grid.Rows.First();
  804. Assert.Equal(1, row.P1);
  805. Assert.Equal('2', row.P2);
  806. Assert.Equal("3", row.P3);
  807. }
  808. [Fact]
  809. public void RowColumnsAreDynamicMembersForNonDynamics()
  810. {
  811. var grid = new WebGrid(GetContext()).Bind(new[]
  812. {
  813. new { P1 = 1, P2 = '2', P3 = "3" }
  814. });
  815. dynamic row = grid.Rows.First();
  816. Assert.Equal(1, row.P1);
  817. Assert.Equal('2', row.P2);
  818. Assert.Equal("3", row.P3);
  819. }
  820. [Fact]
  821. public void RowExposesRowIndex()
  822. {
  823. var grid = new WebGrid(GetContext()).Bind(new[]
  824. {
  825. new { }, new { }, new { }
  826. });
  827. dynamic row = grid.Rows.First();
  828. Assert.Equal(0, row["ROW"]);
  829. row = grid.Rows.Skip(1).First();
  830. Assert.Equal(1, row.ROW);
  831. row = grid.Rows.Skip(2).First();
  832. Assert.Equal(2, row.ROW);
  833. }
  834. [Fact]
  835. public void RowExposesUnderlyingValue()
  836. {
  837. var sb = new StringBuilder("Foo");
  838. sb.Append("Bar");
  839. var grid = new WebGrid(GetContext()).Bind(new[] { sb });
  840. var row = grid.Rows.First();
  841. Assert.Equal(sb, row.Value);
  842. Assert.Equal("FooBar", row.ToString());
  843. Assert.Equal(grid, row.WebGrid);
  844. }
  845. [Fact]
  846. public void RowIndexerThrowsWhenColumnNameIsEmpty()
  847. {
  848. var grid = new WebGrid(GetContext()).Bind(new[] { new { } });
  849. var row = grid.Rows.First();
  850. Assert.ThrowsArgumentNullOrEmptyString(() => { var value = row[String.Empty]; }, "name");
  851. }
  852. [Fact]
  853. public void RowIndexerThrowsWhenColumnNameIsNull()
  854. {
  855. var grid = new WebGrid(GetContext()).Bind(new[] { new { } });
  856. var row = grid.Rows.First();
  857. Assert.ThrowsArgumentNullOrEmptyString(() => { var value = row[null]; }, "name");
  858. }
  859. [Fact] // todo - should throw ArgumentException?
  860. public void RowIndexerThrowsWhenColumnNotFound()
  861. {
  862. var grid = new WebGrid(GetContext()).Bind(new[] { new { } });
  863. var row = grid.Rows.First();
  864. Assert.Throws<InvalidOperationException>(() => { var value = row["NotAColumn"]; });
  865. }
  866. [Fact]
  867. public void RowIndexerThrowsWhenGreaterThanColumnCount()
  868. {
  869. var grid = new WebGrid(GetContext()).Bind(new[]
  870. {
  871. new { P1 = 1, P2 = '2', P3 = "3" }
  872. });
  873. var row = grid.Rows.First();
  874. Assert.Throws<ArgumentOutOfRangeException>(() => { var value = row[4]; });
  875. }
  876. [Fact]
  877. public void RowIndexerThrowsWhenLessThanZero()
  878. {
  879. var grid = new WebGrid(GetContext()).Bind(new[] { new { } });
  880. var row = grid.Rows.First();
  881. Assert.Throws<ArgumentOutOfRangeException>(() => { var value = row[-1]; });
  882. }
  883. [Fact]
  884. public void RowIsEnumerableForDynamics()
  885. {
  886. var grid = new WebGrid(GetContext()).Bind(Dynamics(
  887. new { P1 = 1, P2 = '2', P3 = "3" }
  888. ));
  889. int i = 0;
  890. foreach (var col in (IEnumerable)grid.Rows.First())
  891. {
  892. i++;
  893. }
  894. Assert.Equal(3, i);
  895. }
  896. [Fact]
  897. public void RowIsEnumerableForNonDynamics()
  898. {
  899. var grid = new WebGrid(GetContext()).Bind(new[]
  900. {
  901. new { P1 = 1, P2 = '2', P3 = "3" }
  902. });
  903. int i = 0;
  904. foreach (var col in grid.Rows.First())
  905. {
  906. i++;
  907. }
  908. Assert.Equal(3, i);
  909. }
  910. [Fact]
  911. public void RowIsIndexableByColumnForDynamics()
  912. {
  913. var grid = new WebGrid(GetContext()).Bind(Dynamics(
  914. new { P1 = 1, P2 = '2', P3 = "3" }
  915. ));
  916. var row = grid.Rows.First();
  917. Assert.Equal(1, row["P1"]);
  918. Assert.Equal('2', row["P2"]);
  919. Assert.Equal("3", row["P3"]);
  920. }
  921. [Fact]
  922. public void RowIsIndexableByColumnForNonDynamics()
  923. {
  924. var grid = new WebGrid(GetContext()).Bind(new[]
  925. {
  926. new { P1 = 1, P2 = '2', P3 = "3" }
  927. });
  928. var row = grid.Rows.First();
  929. Assert.Equal(1, row["P1"]);
  930. Assert.Equal('2', row["P2"]);
  931. Assert.Equal("3", row["P3"]);
  932. }
  933. [Fact]
  934. public void RowIsIndexableByIndexForDynamics()
  935. {
  936. var grid = new WebGrid(GetContext()).Bind(Dynamics(
  937. new { P1 = 1, P2 = '2', P3 = "3" }
  938. ));
  939. var row = grid.Rows.First();
  940. Assert.Equal(1, row[0]);
  941. Assert.Equal('2', row[1]);
  942. Assert.Equal("3", row[2]);
  943. }
  944. [Fact]
  945. public void RowIsIndexableByIndexForNonDynamics()
  946. {
  947. var grid = new WebGrid(GetContext()).Bind(new[]
  948. {
  949. new { P1 = 1, P2 = '2', P3 = "3" }
  950. });
  951. var row = grid.Rows.First();
  952. Assert.Equal(1, row[0]);
  953. Assert.Equal('2', row[1]);
  954. Assert.Equal("3", row[2]);
  955. }
  956. [Fact]
  957. public void RowsNotPagedWhenPagingIsDisabled()
  958. {
  959. NameValueCollection queryString = new NameValueCollection();
  960. queryString["page"] = "2";
  961. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 1, canPage: false)
  962. .Bind(new[]
  963. {
  964. new { P1 = 1, P2 = '2', P3 = "3" },
  965. new { P1 = 4, P2 = '5', P3 = "6" }
  966. });
  967. // review: should we reset PageIndex or Sort when operation disabled?
  968. Assert.Equal(0, grid.PageIndex);
  969. Assert.Equal(2, grid.Rows.Count);
  970. Assert.Equal(1, grid.Rows.First()["P1"]);
  971. Assert.Equal(4, grid.Rows.Skip(1).First()["P1"]);
  972. }
  973. [Fact] // todo - should throw ArgumentException?
  974. public void RowTryGetMemberReturnsFalseWhenColumnNotFound()
  975. {
  976. var grid = new WebGrid(GetContext()).Bind(new[] { new { } });
  977. var row = grid.Rows.First();
  978. object value = null;
  979. Assert.False(row.TryGetMember("NotAColumn", out value));
  980. }
  981. [Fact]
  982. public void SelectedIndexCanBeReset()
  983. {
  984. NameValueCollection queryString = new NameValueCollection();
  985. queryString["row"] = "2";
  986. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  987. {
  988. new { P1 = 1, P2 = '2', P3 = "3" },
  989. new { P1 = 4, P2 = '5', P3 = "6" }
  990. });
  991. Assert.Equal(1, grid.SelectedIndex);
  992. grid.SelectedIndex = 0;
  993. Assert.Equal(0, grid.SelectedIndex);
  994. }
  995. [Fact]
  996. public void SelectedIndexCanBeResetToSameValue()
  997. {
  998. NameValueCollection queryString = new NameValueCollection();
  999. queryString["row"] = "2";
  1000. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1001. {
  1002. new { P1 = 1, P2 = '2', P3 = "3" },
  1003. new { P1 = 4, P2 = '5', P3 = "6" }
  1004. });
  1005. grid.SelectedIndex = -1;
  1006. Assert.Equal(-1, grid.SelectedIndex);
  1007. }
  1008. [Fact]
  1009. public void SelectedIndexDefaultsToNegative()
  1010. {
  1011. var grid = new WebGrid(GetContext()).Bind(new[]
  1012. {
  1013. new { P1 = 1, P2 = '2', P3 = "3" },
  1014. new { P1 = 4, P2 = '5', P3 = "6" }
  1015. });
  1016. Assert.False(grid.HasSelection);
  1017. Assert.Equal(-1, grid.SelectedIndex);
  1018. Assert.Equal(null, grid.SelectedRow);
  1019. }
  1020. [Fact]
  1021. public void SelectedIndexResetWhenQueryStringValueGreaterThanRowsPerPage()
  1022. {
  1023. NameValueCollection queryString = new NameValueCollection();
  1024. queryString["row"] = "3";
  1025. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 2).Bind(new[]
  1026. {
  1027. new { P1 = 1, P2 = '2', P3 = "3" },
  1028. new { P1 = 4, P2 = '5', P3 = "6" }
  1029. });
  1030. Assert.False(grid.HasSelection);
  1031. Assert.Equal(-1, grid.SelectedIndex);
  1032. Assert.Equal(null, grid.SelectedRow);
  1033. }
  1034. [Fact]
  1035. public void SelectedIndexPersistsWhenPagingTurnedOff()
  1036. {
  1037. NameValueCollection queryString = new NameValueCollection();
  1038. queryString["row"] = "3";
  1039. var grid = new WebGrid(GetContext(queryString), rowsPerPage: 2, canPage: false).Bind(new[]
  1040. {
  1041. new { }, new { }, new { }, new { }
  1042. });
  1043. grid.SelectedIndex = 3;
  1044. Assert.Equal(3, grid.SelectedIndex);
  1045. }
  1046. [Fact]
  1047. public void SelectedIndexResetWhenQueryStringValueIsInvalid()
  1048. {
  1049. NameValueCollection queryString = new NameValueCollection();
  1050. queryString["row"] = "NotAnInt";
  1051. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1052. {
  1053. new { P1 = 1, P2 = '2', P3 = "3" },
  1054. new { P1 = 4, P2 = '5', P3 = "6" }
  1055. });
  1056. Assert.False(grid.HasSelection);
  1057. Assert.Equal(-1, grid.SelectedIndex);
  1058. Assert.Equal(null, grid.SelectedRow);
  1059. }
  1060. [Fact]
  1061. public void SelectedIndexResetWhenQueryStringValueLessThanOne()
  1062. {
  1063. NameValueCollection queryString = new NameValueCollection();
  1064. queryString["row"] = "0";
  1065. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1066. {
  1067. new { P1 = 1, P2 = '2', P3 = "3" },
  1068. new { P1 = 4, P2 = '5', P3 = "6" }
  1069. });
  1070. Assert.False(grid.HasSelection);
  1071. Assert.Equal(-1, grid.SelectedIndex);
  1072. Assert.Equal(null, grid.SelectedRow);
  1073. }
  1074. [Fact]
  1075. public void SelectedIndexUsesCustomQueryString()
  1076. {
  1077. NameValueCollection queryString = new NameValueCollection();
  1078. queryString["g_sel"] = "2";
  1079. var grid = new WebGrid(GetContext(queryString), fieldNamePrefix: "g_", selectionFieldName: "sel").Bind(new[]
  1080. {
  1081. new { P1 = 1, P2 = '2', P3 = "3" },
  1082. new { P1 = 4, P2 = '5', P3 = "6" }
  1083. });
  1084. Assert.True(grid.HasSelection);
  1085. Assert.Equal(1, grid.SelectedIndex);
  1086. Assert.NotNull(grid.SelectedRow);
  1087. Assert.Equal(4, grid.SelectedRow["P1"]);
  1088. }
  1089. [Fact]
  1090. public void SelectedIndexUsesQueryString()
  1091. {
  1092. NameValueCollection queryString = new NameValueCollection();
  1093. queryString["row"] = "2";
  1094. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1095. {
  1096. new { P1 = 1, P2 = '2', P3 = "3" },
  1097. new { P1 = 4, P2 = '5', P3 = "6" }
  1098. });
  1099. Assert.True(grid.HasSelection);
  1100. Assert.Equal(1, grid.SelectedIndex);
  1101. Assert.NotNull(grid.SelectedRow);
  1102. Assert.Equal(4, grid.SelectedRow["P1"]);
  1103. }
  1104. [Fact]
  1105. public void SelectLink()
  1106. {
  1107. NameValueCollection queryString = new NameValueCollection();
  1108. queryString["page"] = "1";
  1109. queryString["row"] = "1";
  1110. queryString["sort"] = "P1";
  1111. queryString["sortdir"] = "DESC";
  1112. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1113. {
  1114. new { P1 = 1, P2 = '2', P3 = "3" },
  1115. new { P1 = 4, P2 = '5', P3 = "6" }
  1116. });
  1117. string html = grid.Rows[1].GetSelectLink().ToString();
  1118. Assert.Equal("<a href=\"?page=1&amp;row=2&amp;sort=P1&amp;sortdir=DESC\">Select</a>", html.ToString());
  1119. }
  1120. [Fact]
  1121. public void SortCanBeReset()
  1122. {
  1123. NameValueCollection queryString = new NameValueCollection();
  1124. queryString["sort"] = "P1";
  1125. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1126. {
  1127. new { P1 = 1, P2 = '2', P3 = "3" },
  1128. new { P1 = 4, P2 = '5', P3 = "6" }
  1129. });
  1130. Assert.Equal("P1", grid.SortColumn);
  1131. grid.SortColumn = "P2";
  1132. Assert.Equal("P2", grid.SortColumn);
  1133. // verify that selection and page links have updated sort
  1134. Assert.Equal("?sort=P2&row=1", grid.Rows.FirstOrDefault().GetSelectUrl());
  1135. Assert.Equal("?sort=P2&page=1", grid.GetPageUrl(0));
  1136. }
  1137. [Fact]
  1138. public void SortCanBeResetToNull()
  1139. {
  1140. NameValueCollection queryString = new NameValueCollection();
  1141. queryString["sort"] = "P1";
  1142. var grid = new WebGrid(GetContext(queryString)).Bind(new[]
  1143. {
  1144. new { P1 = 1, P2 = '2', P3 = "3" },
  1145. new { P1 = 4, P2 = '5', P3 = "6" }
  1146. });
  1147. Assert.Equal("P1", grid.SortColumn);
  1148. grid.SortColumn = null;
  1149. Assert.Equal(String.Empty, grid.SortColumn);
  1150. // verify that selection and page links have updated sort
  1151. Assert.Equal("?row=1", grid.Rows.FirstOrDefault().GetSelectUrl());
  1152. Assert.Equal("?page=1", grid.GetPageUrl(0));
  1153. }
  1154. [Fact]
  1155. public void SortCanBeResetToSameValue()
  1156. {