linq.qunit.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // QUnit Extensions
  2. // Method Chaning base assertion.
  3. (function (root) {
  4. if (root.Enumerable == null) {
  5. throw new Error("can't find Enumerable. linq.qunit.js must load after linq.js");
  6. }
  7. if ((Object.defineProperties == null)) {
  8. throw new Error("linq.qunit.js supports only defined 'Object.defineProperty' browser");
  9. }
  10. var Enumerable = root.Enumerable;
  11. Enumerable.Assert = {};
  12. // overwrite array
  13. Enumerable.Utils.extendTo(Array);
  14. // defProp helper, support only modern browser
  15. var defineToObject = function (methodName, value) {
  16. Object.defineProperty(Object.prototype, methodName, {
  17. enumerable: false,
  18. configurable: true,
  19. writable: true,
  20. value: value
  21. });
  22. };
  23. var isCollection = function (obj) {
  24. if (obj instanceof Enumerable) return true;
  25. if (obj instanceof Array) return true;
  26. return false;
  27. };
  28. var executeCode = function (action) {
  29. try {
  30. action();
  31. return null;
  32. }
  33. catch (e) {
  34. return e;
  35. }
  36. };
  37. defineToObject("is", function (expected, message) {
  38. /// <signature>
  39. /// <summary>strictEqual. if "this" is Array or Enumerable then deepEqual with expected and both normalized to array.</summary>
  40. /// <param name="expected" type="Object">expected value</param>
  41. /// <param name="message" type="String" optional="true">assertion message</param>
  42. /// <returns type="void"></returns>
  43. /// </signature>
  44. /// <signature>
  45. /// <summary>collection deepEqual. argument is variable.</summary>
  46. /// <param name="variableExpected" type="params Object[]">mulitple arguments. Usage: [1,2,3].is(1,2,3).</param>
  47. /// <returns type="void"></returns>
  48. /// </signature>
  49. /// <signature>
  50. /// <summary>ok(true). expected function is passed actual. if result is true then ok.</summary>
  51. /// <param name="expected" type="Func&lt;T,bool>">function checker, return boolean</param>
  52. /// <param name="message" type="String" optional="true">assertion message</param>
  53. /// <returns type="void"></returns>
  54. /// </signature>
  55. if (isCollection(this)) {
  56. if (arguments.length <= 2 && isCollection(expected)) {
  57. deepEqual(Enumerable.from(this).toArray(), Enumerable.from(expected).toArray(), message);
  58. }
  59. else {
  60. deepEqual(Enumerable.from(this).toArray(), Enumerable.from(arguments).toArray());
  61. }
  62. }
  63. else {
  64. if (expected instanceof Function) {
  65. ok(expected(this.valueOf()), message);
  66. }
  67. else {
  68. strictEqual(this.valueOf(), expected, message);
  69. }
  70. }
  71. });
  72. defineToObject("isNot", function (expected, message) {
  73. /// <signature>
  74. /// <summary>notStrictEqual. if "this" is Array or Enumerable then notDeepEqual with expected and both normalized to array.</summary>
  75. /// <param name="expected" type="Object">expected value.</param>
  76. /// <param name="message" type="String" optional="true">assertion message.</param>
  77. /// <returns type="void"></returns>
  78. /// </signature>
  79. /// <signature>
  80. /// <summary>collection notDeepEqual. argument is variable.</summary>
  81. /// <param name="variableExpected" type="params Object[]">variable arguments. Usage: [1,2,3].isNot(-1,2,3).</param>
  82. /// <returns type="void"></returns>
  83. /// </signature>
  84. /// <signature>
  85. /// <summary>ok(false). expected function pass actual. if result is false then ok.</summary>
  86. /// <param name="expected" type="Func&lt;T,bool>">function checker, return boolean</param>
  87. /// <param name="message" type="String" optional="true">assertion message</param>
  88. /// <returns type="void"></returns>
  89. /// </signature>
  90. if (isCollection(this)) {
  91. if (arguments.length <= 2 && isCollection(expected)) {
  92. notDeepEqual(Enumerable.from(this).toArray(), Enumerable.from(expected).toArray(), message);
  93. }
  94. else {
  95. notDeepEqual(Enumerable.from(this).toArray(), Enumerable.from(arguments).toArray());
  96. }
  97. }
  98. else {
  99. if (expected instanceof Function) {
  100. ok(!expected(this.valueOf()), message);
  101. }
  102. else {
  103. notStrictEqual(this.valueOf(), expected, message);
  104. }
  105. }
  106. });
  107. defineToObject("isExpr", function (expression, message) {
  108. /// <summary>ok(true). string expression is converted lambda. lambda is passed actual. if result is true then ok.</summary>
  109. /// <param name="expression" type="String">expression string converted to function checker, lambda return boolean</param>
  110. /// <param name="message" type="String" optional="true">assertion message</param>
  111. /// <returns type="void"></returns>
  112. ok(Enumerable.Utils.createLambda(expression)(this.valueOf()), message);
  113. });
  114. defineToObject("isNotExpr", function (expression, message) {
  115. /// <summary>ok(false). string expression is converted lambda. lambda is passed actual. if result is false then ok.</summary>
  116. /// <param name="expression" type="String">expression string converted to function checker, lambda return boolean</param>
  117. /// <param name="message" type="String" optional="true">assertion message</param>
  118. /// <returns type="void"></returns>
  119. ok(!Enumerable.Utils.createLambda(expression)(this.valueOf()), message);
  120. });
  121. defineToObject("isTrue", function (message) {
  122. /// <summary>shorthand of is(true).</summary>
  123. /// <param name="message" type="String" optional="true">assertion message.</param>
  124. /// <returns type="void"></returns>
  125. this.is(true, message);
  126. });
  127. defineToObject("isFalse", function (message) {
  128. /// <summary>shorthand of is(false).</summary>
  129. /// <param name="message" type="String" optional="true">assertion message.</param>
  130. /// <returns type="void"></returns>
  131. this.is(false, message);
  132. });
  133. Enumerable.Assert.expectError = function (testAction, message) {
  134. /// <summary>Throw error in testCode.</summary>
  135. /// <param name="testCode" type="Action">action function.</param>
  136. /// <param name="message" type="String" optional="true">assertion message.</param>
  137. /// <returns type="Error"></returns>
  138. var error = executeCode(testAction);
  139. if (error != null) {
  140. ok(true, message);
  141. }
  142. else {
  143. ok(false, "Failed testCode does not throw error." + ((message != null) ? " Message:" + message : ""));
  144. }
  145. return error;
  146. };
  147. defineToObject("doesNotThrow", function (testAction, message) {
  148. /// <summary>Does not throw error in testCode.</summary>
  149. /// <param name="testCode" type="Function">action function.</param>
  150. /// <param name="message" type="String" optional="true">assertion message.</param>
  151. /// <returns type="void"></returns>
  152. var error = executeCode(testAction);
  153. if (error != null) {
  154. ok(false, "Failed testCode throws error. CatchedErrorMessage:" + error.message + ((message != null) ? " Message:" + message : ""));
  155. }
  156. });
  157. })(this);