@kensio/smartass 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/assert/array-equals/array-equals.test.d.ts +2 -0
  2. package/dist/assert/array-equals/array-equals.test.d.ts.map +1 -0
  3. package/dist/assert/array-equals/array-equals.test.js +39 -0
  4. package/dist/assert/array-equals/array-equals.test.js.map +1 -0
  5. package/dist/assert/array-includes/array-includes.match.d.ts +5 -3
  6. package/dist/assert/array-includes/array-includes.match.d.ts.map +1 -1
  7. package/dist/assert/array-includes/array-includes.match.js.map +1 -1
  8. package/dist/assert/array-includes/array-includes.test.d.ts +2 -0
  9. package/dist/assert/array-includes/array-includes.test.d.ts.map +1 -0
  10. package/dist/assert/array-includes/array-includes.test.js +79 -0
  11. package/dist/assert/array-includes/array-includes.test.js.map +1 -0
  12. package/dist/assert/array-includes-all/array-includes-all.match.d.ts +5 -6
  13. package/dist/assert/array-includes-all/array-includes-all.match.d.ts.map +1 -1
  14. package/dist/assert/array-includes-all/array-includes-all.match.js.map +1 -1
  15. package/dist/assert/array-includes-all/array-includes-all.test.d.ts +2 -0
  16. package/dist/assert/array-includes-all/array-includes-all.test.d.ts.map +1 -0
  17. package/dist/assert/array-includes-all/array-includes-all.test.js +163 -0
  18. package/dist/assert/array-includes-all/array-includes-all.test.js.map +1 -0
  19. package/dist/assert/array-length/array-length.match.d.ts +7 -2
  20. package/dist/assert/array-length/array-length.match.d.ts.map +1 -1
  21. package/dist/assert/array-length/array-length.match.js +1 -1
  22. package/dist/assert/array-length/array-length.match.js.map +1 -1
  23. package/dist/assert/array-length/array-length.test.d.ts +2 -0
  24. package/dist/assert/array-length/array-length.test.d.ts.map +1 -0
  25. package/dist/assert/array-length/array-length.test.js +104 -0
  26. package/dist/assert/array-length/array-length.test.js.map +1 -0
  27. package/dist/assert/array-min-length/array-min-length.match.d.ts +2 -1
  28. package/dist/assert/array-min-length/array-min-length.match.d.ts.map +1 -1
  29. package/dist/assert/array-min-length/array-min-length.match.js.map +1 -1
  30. package/dist/assert/array-min-length/array-min-length.test.d.ts +2 -0
  31. package/dist/assert/array-min-length/array-min-length.test.d.ts.map +1 -0
  32. package/dist/assert/array-min-length/array-min-length.test.js +115 -0
  33. package/dist/assert/array-min-length/array-min-length.test.js.map +1 -0
  34. package/dist/assert/array-not-empty/array-not-empty.assert.js.map +1 -1
  35. package/dist/assert/array-not-empty/array-not-empty.match.d.ts +2 -1
  36. package/dist/assert/array-not-empty/array-not-empty.match.d.ts.map +1 -1
  37. package/dist/assert/array-not-empty/array-not-empty.match.js +1 -1
  38. package/dist/assert/array-not-empty/array-not-empty.match.js.map +1 -1
  39. package/dist/assert/array-not-empty/array-not-empty.test.d.ts +2 -0
  40. package/dist/assert/array-not-empty/array-not-empty.test.d.ts.map +1 -0
  41. package/dist/assert/array-not-empty/array-not-empty.test.js +76 -0
  42. package/dist/assert/array-not-empty/array-not-empty.test.js.map +1 -0
  43. package/dist/assert/buffer-equal/buffer-equal.assert.d.ts +1 -1
  44. package/dist/assert/buffer-equal/buffer-equal.assert.d.ts.map +1 -1
  45. package/dist/assert/buffer-equal/buffer-equal.assert.js.map +1 -1
  46. package/dist/assert/buffer-equal/buffer-equal.match.d.ts +1 -1
  47. package/dist/assert/buffer-equal/buffer-equal.match.d.ts.map +1 -1
  48. package/dist/assert/buffer-equal/buffer-equal.match.js +1 -1
  49. package/dist/assert/buffer-equal/buffer-equal.match.js.map +1 -1
  50. package/dist/assert/buffer-equal/buffer-equal.test.d.ts +2 -0
  51. package/dist/assert/buffer-equal/buffer-equal.test.d.ts.map +1 -0
  52. package/dist/assert/buffer-equal/buffer-equal.test.js +170 -0
  53. package/dist/assert/buffer-equal/buffer-equal.test.js.map +1 -0
  54. package/dist/assert/false/false.test.d.ts +2 -0
  55. package/dist/assert/false/false.test.d.ts.map +1 -0
  56. package/dist/assert/false/false.test.js +45 -0
  57. package/dist/assert/false/false.test.js.map +1 -0
  58. package/dist/assert/identical/identical.test.d.ts +2 -0
  59. package/dist/assert/identical/identical.test.d.ts.map +1 -0
  60. package/dist/assert/identical/identical.test.js +61 -0
  61. package/dist/assert/identical/identical.test.js.map +1 -0
  62. package/dist/assert/instance-of/instance-of.assert.d.ts +2 -1
  63. package/dist/assert/instance-of/instance-of.assert.d.ts.map +1 -1
  64. package/dist/assert/instance-of/instance-of.assert.js.map +1 -1
  65. package/dist/assert/instance-of/instance-of.match.d.ts +2 -1
  66. package/dist/assert/instance-of/instance-of.match.d.ts.map +1 -1
  67. package/dist/assert/instance-of/instance-of.match.js.map +1 -1
  68. package/dist/assert/instance-of/instance-of.test.d.ts +2 -0
  69. package/dist/assert/instance-of/instance-of.test.d.ts.map +1 -0
  70. package/dist/assert/instance-of/instance-of.test.js +112 -0
  71. package/dist/assert/instance-of/instance-of.test.js.map +1 -0
  72. package/dist/assert/non-nullable/non-nullable.test.d.ts +2 -0
  73. package/dist/assert/non-nullable/non-nullable.test.d.ts.map +1 -0
  74. package/dist/assert/non-nullable/non-nullable.test.js +64 -0
  75. package/dist/assert/non-nullable/non-nullable.test.js.map +1 -0
  76. package/dist/assert/number-between/number-between.test.d.ts +2 -0
  77. package/dist/assert/number-between/number-between.test.d.ts.map +1 -0
  78. package/dist/assert/number-between/number-between.test.js +185 -0
  79. package/dist/assert/number-between/number-between.test.js.map +1 -0
  80. package/dist/assert/number-to-nearest/number-to-nearest.test.d.ts +2 -0
  81. package/dist/assert/number-to-nearest/number-to-nearest.test.d.ts.map +1 -0
  82. package/dist/assert/number-to-nearest/number-to-nearest.test.js +129 -0
  83. package/dist/assert/number-to-nearest/number-to-nearest.test.js.map +1 -0
  84. package/dist/assert/object-equals/object-equals.test.d.ts +2 -0
  85. package/dist/assert/object-equals/object-equals.test.d.ts.map +1 -0
  86. package/dist/assert/object-equals/object-equals.test.js +87 -0
  87. package/dist/assert/object-equals/object-equals.test.js.map +1 -0
  88. package/dist/assert/object-has-property/object-has-property.assert.d.ts +1 -1
  89. package/dist/assert/object-has-property/object-has-property.assert.d.ts.map +1 -1
  90. package/dist/assert/object-has-property/object-has-property.match.d.ts +8 -3
  91. package/dist/assert/object-has-property/object-has-property.match.d.ts.map +1 -1
  92. package/dist/assert/object-has-property/object-has-property.match.js +1 -1
  93. package/dist/assert/object-has-property/object-has-property.match.js.map +1 -1
  94. package/dist/assert/object-has-property/object-has-property.test.d.ts +2 -0
  95. package/dist/assert/object-has-property/object-has-property.test.d.ts.map +1 -0
  96. package/dist/assert/object-has-property/object-has-property.test.js +123 -0
  97. package/dist/assert/object-has-property/object-has-property.test.js.map +1 -0
  98. package/dist/assert/object-matches/object-matches.assert.d.ts +26 -7
  99. package/dist/assert/object-matches/object-matches.assert.d.ts.map +1 -1
  100. package/dist/assert/object-matches/object-matches.assert.js.map +1 -1
  101. package/dist/assert/object-matches/object-matches.test.d.ts +2 -0
  102. package/dist/assert/object-matches/object-matches.test.d.ts.map +1 -0
  103. package/dist/assert/object-matches/object-matches.test.js +134 -0
  104. package/dist/assert/object-matches/object-matches.test.js.map +1 -0
  105. package/dist/assert/one-of/one-of.test.d.ts +2 -0
  106. package/dist/assert/one-of/one-of.test.d.ts.map +1 -0
  107. package/dist/assert/one-of/one-of.test.js +122 -0
  108. package/dist/assert/one-of/one-of.test.js.map +1 -0
  109. package/dist/assert/string-ends-with/string-ends-with.match.js +1 -1
  110. package/dist/assert/string-ends-with/string-ends-with.test.d.ts +2 -0
  111. package/dist/assert/string-ends-with/string-ends-with.test.d.ts.map +1 -0
  112. package/dist/assert/string-ends-with/string-ends-with.test.js +104 -0
  113. package/dist/assert/string-ends-with/string-ends-with.test.js.map +1 -0
  114. package/dist/assert/string-includes/string-includes.test.d.ts +2 -0
  115. package/dist/assert/string-includes/string-includes.test.d.ts.map +1 -0
  116. package/dist/assert/string-includes/string-includes.test.js +115 -0
  117. package/dist/assert/string-includes/string-includes.test.js.map +1 -0
  118. package/dist/assert/string-length/string-length.match.d.ts +5 -2
  119. package/dist/assert/string-length/string-length.match.d.ts.map +1 -1
  120. package/dist/assert/string-length/string-length.match.js +1 -1
  121. package/dist/assert/string-length/string-length.match.js.map +1 -1
  122. package/dist/assert/string-length/string-length.test.d.ts +2 -0
  123. package/dist/assert/string-length/string-length.test.d.ts.map +1 -0
  124. package/dist/assert/string-length/string-length.test.js +151 -0
  125. package/dist/assert/string-length/string-length.test.js.map +1 -0
  126. package/dist/assert/string-not-includes/string-not-includes.test.d.ts +2 -0
  127. package/dist/assert/string-not-includes/string-not-includes.test.d.ts.map +1 -0
  128. package/dist/assert/string-not-includes/string-not-includes.test.js +124 -0
  129. package/dist/assert/string-not-includes/string-not-includes.test.js.map +1 -0
  130. package/dist/assert/string-starts-with/string-starts-with.assert.d.ts.map +1 -1
  131. package/dist/assert/string-starts-with/string-starts-with.assert.js +4 -2
  132. package/dist/assert/string-starts-with/string-starts-with.assert.js.map +1 -1
  133. package/dist/assert/string-starts-with/string-starts-with.match.d.ts +6 -0
  134. package/dist/assert/string-starts-with/string-starts-with.match.d.ts.map +1 -0
  135. package/dist/assert/string-starts-with/string-starts-with.match.js +9 -0
  136. package/dist/assert/string-starts-with/string-starts-with.match.js.map +1 -0
  137. package/dist/assert/string-starts-with/string-starts-with.test.d.ts +2 -0
  138. package/dist/assert/string-starts-with/string-starts-with.test.d.ts.map +1 -0
  139. package/dist/assert/string-starts-with/string-starts-with.test.js +90 -0
  140. package/dist/assert/string-starts-with/string-starts-with.test.js.map +1 -0
  141. package/dist/assert/throws-error/throws-error.test.d.ts +2 -0
  142. package/dist/assert/throws-error/throws-error.test.d.ts.map +1 -0
  143. package/dist/assert/throws-error/throws-error.test.js +74 -0
  144. package/dist/assert/throws-error/throws-error.test.js.map +1 -0
  145. package/dist/assert/throws-error-async/throws-error-async.test.d.ts +2 -0
  146. package/dist/assert/throws-error-async/throws-error-async.test.d.ts.map +1 -0
  147. package/dist/assert/throws-error-async/throws-error-async.test.js +61 -0
  148. package/dist/assert/throws-error-async/throws-error-async.test.js.map +1 -0
  149. package/dist/assert/throws-error-like/throws-error-like.test.d.ts +2 -0
  150. package/dist/assert/throws-error-like/throws-error-like.test.d.ts.map +1 -0
  151. package/dist/assert/throws-error-like/throws-error-like.test.js +151 -0
  152. package/dist/assert/throws-error-like/throws-error-like.test.js.map +1 -0
  153. package/dist/assert/true/true.test.d.ts +2 -0
  154. package/dist/assert/true/true.test.d.ts.map +1 -0
  155. package/dist/assert/true/true.test.js +45 -0
  156. package/dist/assert/true/true.test.js.map +1 -0
  157. package/dist/assert/type-bigint/type-bigint.assert.d.ts.map +1 -1
  158. package/dist/assert/type-bigint/type-bigint.assert.js +4 -2
  159. package/dist/assert/type-bigint/type-bigint.assert.js.map +1 -1
  160. package/dist/assert/type-bigint/type-bigint.match.d.ts +6 -0
  161. package/dist/assert/type-bigint/type-bigint.match.d.ts.map +1 -0
  162. package/dist/assert/type-bigint/type-bigint.match.js +8 -0
  163. package/dist/assert/type-bigint/type-bigint.match.js.map +1 -0
  164. package/dist/assert/type-bigint/type-bigint.test.d.ts +2 -0
  165. package/dist/assert/type-bigint/type-bigint.test.d.ts.map +1 -0
  166. package/dist/assert/type-bigint/type-bigint.test.js +83 -0
  167. package/dist/assert/type-bigint/type-bigint.test.js.map +1 -0
  168. package/dist/assert/type-boolean/type-boolean.assert.d.ts.map +1 -1
  169. package/dist/assert/type-boolean/type-boolean.assert.js +4 -2
  170. package/dist/assert/type-boolean/type-boolean.assert.js.map +1 -1
  171. package/dist/assert/type-boolean/type-boolean.match.d.ts +6 -0
  172. package/dist/assert/type-boolean/type-boolean.match.d.ts.map +1 -0
  173. package/dist/assert/type-boolean/type-boolean.match.js +8 -0
  174. package/dist/assert/type-boolean/type-boolean.match.js.map +1 -0
  175. package/dist/assert/type-boolean/type-boolean.test.d.ts +2 -0
  176. package/dist/assert/type-boolean/type-boolean.test.d.ts.map +1 -0
  177. package/dist/assert/type-boolean/type-boolean.test.js +64 -0
  178. package/dist/assert/type-boolean/type-boolean.test.js.map +1 -0
  179. package/dist/assert/type-function/type-function.assert.d.ts.map +1 -1
  180. package/dist/assert/type-function/type-function.assert.js +4 -2
  181. package/dist/assert/type-function/type-function.assert.js.map +1 -1
  182. package/dist/assert/type-function/type-function.match.d.ts +6 -0
  183. package/dist/assert/type-function/type-function.match.d.ts.map +1 -0
  184. package/dist/assert/type-function/type-function.match.js +11 -0
  185. package/dist/assert/type-function/type-function.match.js.map +1 -0
  186. package/dist/assert/type-function/type-function.test.d.ts +2 -0
  187. package/dist/assert/type-function/type-function.test.d.ts.map +1 -0
  188. package/dist/assert/type-function/type-function.test.js +84 -0
  189. package/dist/assert/type-function/type-function.test.js.map +1 -0
  190. package/dist/assert/type-number/type-number.assert.d.ts.map +1 -1
  191. package/dist/assert/type-number/type-number.assert.js +4 -2
  192. package/dist/assert/type-number/type-number.assert.js.map +1 -1
  193. package/dist/assert/type-number/type-number.match.d.ts +6 -0
  194. package/dist/assert/type-number/type-number.match.d.ts.map +1 -0
  195. package/dist/assert/type-number/type-number.match.js +8 -0
  196. package/dist/assert/type-number/type-number.match.js.map +1 -0
  197. package/dist/assert/type-number/type-number.test.d.ts +2 -0
  198. package/dist/assert/type-number/type-number.test.d.ts.map +1 -0
  199. package/dist/assert/type-number/type-number.test.js +82 -0
  200. package/dist/assert/type-number/type-number.test.js.map +1 -0
  201. package/dist/assert/type-numeric/type-numeric.assert.d.ts.map +1 -1
  202. package/dist/assert/type-numeric/type-numeric.assert.js +4 -2
  203. package/dist/assert/type-numeric/type-numeric.assert.js.map +1 -1
  204. package/dist/assert/type-numeric/type-numeric.match.d.ts +6 -0
  205. package/dist/assert/type-numeric/type-numeric.match.d.ts.map +1 -0
  206. package/dist/assert/type-numeric/type-numeric.match.js +8 -0
  207. package/dist/assert/type-numeric/type-numeric.match.js.map +1 -0
  208. package/dist/assert/type-numeric/type-numeric.test.d.ts +2 -0
  209. package/dist/assert/type-numeric/type-numeric.test.d.ts.map +1 -0
  210. package/dist/assert/type-numeric/type-numeric.test.js +96 -0
  211. package/dist/assert/type-numeric/type-numeric.test.js.map +1 -0
  212. package/dist/assert/type-object/type-object.assert.d.ts.map +1 -1
  213. package/dist/assert/type-object/type-object.assert.js +4 -2
  214. package/dist/assert/type-object/type-object.assert.js.map +1 -1
  215. package/dist/assert/type-object/type-object.match.d.ts +6 -0
  216. package/dist/assert/type-object/type-object.match.d.ts.map +1 -0
  217. package/dist/assert/type-object/type-object.match.js +8 -0
  218. package/dist/assert/type-object/type-object.match.js.map +1 -0
  219. package/dist/assert/type-object/type-object.test.d.ts +2 -0
  220. package/dist/assert/type-object/type-object.test.d.ts.map +1 -0
  221. package/dist/assert/type-object/type-object.test.js +71 -0
  222. package/dist/assert/type-object/type-object.test.js.map +1 -0
  223. package/dist/assert/type-string/type-string.assert.d.ts.map +1 -1
  224. package/dist/assert/type-string/type-string.assert.js +4 -2
  225. package/dist/assert/type-string/type-string.assert.js.map +1 -1
  226. package/dist/assert/type-string/type-string.match.d.ts +6 -0
  227. package/dist/assert/type-string/type-string.match.d.ts.map +1 -0
  228. package/dist/assert/type-string/type-string.match.js +8 -0
  229. package/dist/assert/type-string/type-string.match.js.map +1 -0
  230. package/dist/assert/type-string/type-string.test.d.ts +2 -0
  231. package/dist/assert/type-string/type-string.test.d.ts.map +1 -0
  232. package/dist/assert/type-string/type-string.test.js +62 -0
  233. package/dist/assert/type-string/type-string.test.js.map +1 -0
  234. package/dist/assert/type-typed-array/type-typed-array.assert.d.ts +1 -4
  235. package/dist/assert/type-typed-array/type-typed-array.assert.d.ts.map +1 -1
  236. package/dist/assert/type-typed-array/type-typed-array.assert.js +4 -2
  237. package/dist/assert/type-typed-array/type-typed-array.assert.js.map +1 -1
  238. package/dist/assert/type-typed-array/type-typed-array.match.d.ts +10 -0
  239. package/dist/assert/type-typed-array/type-typed-array.match.d.ts.map +1 -0
  240. package/dist/assert/type-typed-array/type-typed-array.match.js +8 -0
  241. package/dist/assert/type-typed-array/type-typed-array.match.js.map +1 -0
  242. package/dist/assert/type-typed-array/type-typed-array.test.d.ts +2 -0
  243. package/dist/assert/type-typed-array/type-typed-array.test.d.ts.map +1 -0
  244. package/dist/assert/type-typed-array/type-typed-array.test.js +173 -0
  245. package/dist/assert/type-typed-array/type-typed-array.test.js.map +1 -0
  246. package/dist/assert/typeof/typeof.test.d.ts +2 -0
  247. package/dist/assert/typeof/typeof.test.d.ts.map +1 -0
  248. package/dist/assert/typeof/typeof.test.js +61 -0
  249. package/dist/assert/typeof/typeof.test.js.map +1 -0
  250. package/dist/assert/undefined/undefined.test.d.ts +2 -0
  251. package/dist/assert/undefined/undefined.test.d.ts.map +1 -0
  252. package/dist/assert/undefined/undefined.test.js +45 -0
  253. package/dist/assert/undefined/undefined.test.js.map +1 -0
  254. package/dist/assert/uuid/uuid-v4.assert.d.ts +1 -3
  255. package/dist/assert/uuid/uuid-v4.assert.d.ts.map +1 -1
  256. package/dist/assert/uuid/uuid-v4.assert.js +4 -3
  257. package/dist/assert/uuid/uuid-v4.assert.js.map +1 -1
  258. package/dist/assert/uuid/uuid-v4.match.d.ts +8 -0
  259. package/dist/assert/uuid/uuid-v4.match.d.ts.map +1 -0
  260. package/dist/assert/uuid/uuid-v4.match.js +9 -0
  261. package/dist/assert/uuid/uuid-v4.match.js.map +1 -0
  262. package/dist/assert/uuid/uuid-v4.test.d.ts +2 -0
  263. package/dist/assert/uuid/uuid-v4.test.d.ts.map +1 -0
  264. package/dist/assert/uuid/uuid-v4.test.js +81 -0
  265. package/dist/assert/uuid/uuid-v4.test.js.map +1 -0
  266. package/dist/assertion-error.d.ts +0 -1
  267. package/dist/assertion-error.d.ts.map +1 -1
  268. package/dist/assertion-error.js +0 -1
  269. package/dist/assertion-error.js.map +1 -1
  270. package/dist/describe/describe.test.d.ts +2 -0
  271. package/dist/describe/describe.test.d.ts.map +1 -0
  272. package/dist/describe/describe.test.js +313 -0
  273. package/dist/describe/describe.test.js.map +1 -0
  274. package/dist/index.d.ts +16 -0
  275. package/dist/index.d.ts.map +1 -1
  276. package/dist/index.js +16 -0
  277. package/dist/index.js.map +1 -1
  278. package/dist/match/match.d.ts +5 -0
  279. package/dist/match/match.d.ts.map +1 -1
  280. package/dist/match/match.js.map +1 -1
  281. package/package.json +6 -3
@@ -0,0 +1,124 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assertStringNotIncludes } from "./string-not-includes.assert.js";
3
+ import { desc, repr } from "../../describe/describe.js";
4
+ import { stringNotIncluding } from "./string-not-includes.match.js";
5
+ import { assertObjectMatches } from "../object-matches/object-matches.assert.js";
6
+ describe("string-not-includes", () => {
7
+ describe("assertStringNotIncludes", () => {
8
+ it("throws when string includes substring", () => {
9
+ expect(() => {
10
+ assertStringNotIncludes("hello world", "world");
11
+ }).toThrow('Expected string "hello world" not to include "world", but it did.');
12
+ });
13
+ it("does not throw when string does not include substring", () => {
14
+ expect(() => {
15
+ assertStringNotIncludes("hello world", "foo");
16
+ }).not.toThrow();
17
+ });
18
+ it("throws with custom message", () => {
19
+ expect(() => {
20
+ assertStringNotIncludes("hello", "ell", "Custom error message");
21
+ }).toThrow("Custom error message");
22
+ });
23
+ it("throws with empty substring", () => {
24
+ expect(() => {
25
+ assertStringNotIncludes("hello", "");
26
+ }).toThrow('Expected string "hello" not to include "", but it did.');
27
+ });
28
+ it("is case sensitive", () => {
29
+ expect(() => {
30
+ assertStringNotIncludes("Hello World", "hello");
31
+ }).not.toThrow();
32
+ });
33
+ it("throws with substring at start", () => {
34
+ expect(() => {
35
+ assertStringNotIncludes("hello world", "hello");
36
+ }).toThrow('Expected string "hello world" not to include "hello", but it did.');
37
+ });
38
+ it("throws with substring at end", () => {
39
+ expect(() => {
40
+ assertStringNotIncludes("hello world", "world");
41
+ }).toThrow('Expected string "hello world" not to include "world", but it did.');
42
+ });
43
+ it("throws with substring in middle", () => {
44
+ expect(() => {
45
+ assertStringNotIncludes("hello world", "o w");
46
+ }).toThrow('Expected string "hello world" not to include "o w", but it did.');
47
+ });
48
+ });
49
+ describe("stringNotIncluding", () => {
50
+ it("works as composable matcher", () => {
51
+ function getConfig() {
52
+ return {
53
+ filename: "config.json",
54
+ options: { flag: "--debug" },
55
+ };
56
+ }
57
+ const config = getConfig();
58
+ assertObjectMatches(config, {
59
+ options: { flag: stringNotIncluding("error") },
60
+ });
61
+ // Null-chain operator ? is not required after type narrowing.
62
+ // TypeScript knows config.options.flag is a string.
63
+ const flag = config.options.flag;
64
+ expect(flag).toBeTypeOf("string");
65
+ expect(flag.includes("error")).toBe(false);
66
+ });
67
+ it("matches strings that do not include substring", () => {
68
+ const matcher = stringNotIncluding("world");
69
+ expect(matcher.matches("hello")).toBe(true);
70
+ });
71
+ it("does not match strings that include substring", () => {
72
+ const matcher = stringNotIncluding("world");
73
+ expect(matcher.matches("hello world")).toBe(false);
74
+ });
75
+ it("does not match empty string with non-empty substring", () => {
76
+ const matcher = stringNotIncluding("world");
77
+ expect(matcher.matches("")).toBe(true);
78
+ });
79
+ it("does not match when string equals substring", () => {
80
+ const matcher = stringNotIncluding("world");
81
+ expect(matcher.matches("world")).toBe(false);
82
+ });
83
+ it("works with empty substring", () => {
84
+ const matcher = stringNotIncluding("");
85
+ expect(matcher.matches("hello")).toBe(false);
86
+ expect(matcher.matches("")).toBe(false);
87
+ });
88
+ it("is case sensitive", () => {
89
+ const matcher = stringNotIncluding("hello");
90
+ expect(matcher.matches("Hello World")).toBe(true);
91
+ expect(matcher.matches("hello world")).toBe(false);
92
+ });
93
+ it("works with substring at start", () => {
94
+ const matcher = stringNotIncluding("hello");
95
+ expect(matcher.matches("hello world")).toBe(false);
96
+ expect(matcher.matches("world hello")).toBe(false);
97
+ });
98
+ it("works with substring at end", () => {
99
+ const matcher = stringNotIncluding("world");
100
+ expect(matcher.matches("hello world")).toBe(false);
101
+ expect(matcher.matches("world hello")).toBe(false);
102
+ });
103
+ it("does not match non-string values", () => {
104
+ const matcher = stringNotIncluding("foo");
105
+ expect(matcher.matches(null)).toBe(false);
106
+ expect(matcher.matches(undefined)).toBe(false);
107
+ expect(matcher.matches(123)).toBe(false);
108
+ expect(matcher.matches(true)).toBe(false);
109
+ });
110
+ it("describes the matcher", () => {
111
+ const matcher = stringNotIncluding("foo");
112
+ expect(desc(matcher)).toBe('string not including "foo"');
113
+ });
114
+ it("represents the matcher", () => {
115
+ const matcher = stringNotIncluding("foobar");
116
+ expect(repr(matcher)).toBe('"✗foobar✗"');
117
+ });
118
+ it("represents with special characters", () => {
119
+ const matcher = stringNotIncluding(".");
120
+ expect(repr(matcher)).toBe('"✗.✗"');
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=string-not-includes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-not-includes.test.js","sourceRoot":"","sources":["../../../src/assert/string-not-includes/string-not-includes.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"string-starts-with.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.assert.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAC3D,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,CASlC"}
1
+ {"version":3,"file":"string-starts-with.assert.d.ts","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.assert.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAC3D,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,CAUlC"}
@@ -1,12 +1,14 @@
1
1
  import { AssertionError } from "../../assertion-error.js";
2
2
  import { desc, repr } from "../../describe/describe.js";
3
+ import { stringStartingWith } from "./string-starts-with.match.js";
3
4
  /**
4
5
  * Assert that a string starts with a given prefix, with type narrowing.
5
6
  */
6
7
  export function assertStringStartsWith(value, prefix, message) {
7
- if (!value.startsWith(prefix)) {
8
+ const matcher = stringStartingWith(prefix);
9
+ if (!matcher.matches(value)) {
8
10
  throw new AssertionError(message ??
9
- `Expected ${desc(value)} to start with ${repr(prefix)}, but it did not.`, value, `string starting with ${repr(prefix)}`);
11
+ `Expected ${desc(value)} to start with ${repr(prefix)}, but it did not.`, value, matcher.represent());
10
12
  }
11
13
  }
12
14
  //# sourceMappingURL=string-starts-with.assert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"string-starts-with.assert.js","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,MAAS,EACT,OAAgB;IAEhB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,cAAc,CACtB,OAAO;YACL,YAAY,IAAI,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAC1E,KAAK,EACL,wBAAwB,IAAI,CAAC,MAAM,CAAC,EAAE,CACvC,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"string-starts-with.assert.js","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,MAAS,EACT,OAAgB;IAEhB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CACtB,OAAO;YACL,YAAY,IAAI,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAC1E,KAAK,EACL,OAAO,CAAC,SAAS,EAAE,CACpB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type AssertionMatcher } from "../../match/match.js";
2
+ /**
3
+ * Matcher for a string that starts with a given prefix.
4
+ */
5
+ export declare function stringStartingWith<const T extends string>(prefix: T): AssertionMatcher<`${T}${string}`>;
6
+ //# sourceMappingURL=string-starts-with.match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-starts-with.match.d.ts","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.match.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAiB,MAAM,sBAAsB,CAAC;AAE5E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EACvD,MAAM,EAAE,CAAC,GACR,gBAAgB,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,CAOnC"}
@@ -0,0 +1,9 @@
1
+ import { repr } from "../../describe/describe.js";
2
+ import { createMatcher } from "../../match/match.js";
3
+ /**
4
+ * Matcher for a string that starts with a given prefix.
5
+ */
6
+ export function stringStartingWith(prefix) {
7
+ return createMatcher((value) => typeof value === "string" && value.startsWith(prefix), () => `string starting with ${repr(prefix)}`, () => `"${prefix}…"`);
8
+ }
9
+ //# sourceMappingURL=string-starts-with.match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-starts-with.match.js","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.match.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAyB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAS;IAET,OAAO,aAAa,CAClB,CAAC,KAAK,EAA4B,EAAE,CAClC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EACvD,GAAG,EAAE,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,EAAE,EAC5C,GAAG,EAAE,CAAC,IAAI,MAAM,IAAI,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=string-starts-with.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-starts-with.test.d.ts","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assertStringStartsWith } from "./string-starts-with.assert.js";
3
+ import { stringStartingWith } from "./string-starts-with.match.js";
4
+ import { desc, repr } from "../../describe/describe.js";
5
+ describe("string-starts-with", () => {
6
+ describe("assertStringStartsWith", () => {
7
+ it("throws when string does not start with prefix", () => {
8
+ expect(() => {
9
+ assertStringStartsWith("hello world", "foo");
10
+ }).toThrow('Expected string "hello world" to start with "foo", but it did not.');
11
+ });
12
+ it("does not throw when string starts with prefix", () => {
13
+ expect(() => {
14
+ assertStringStartsWith("hello world", "hello");
15
+ }).not.toThrow();
16
+ });
17
+ it("throws with custom message", () => {
18
+ expect(() => {
19
+ assertStringStartsWith("hello", "goodbye", "Custom error message");
20
+ }).toThrow("Custom error message");
21
+ });
22
+ it("works with empty prefix", () => {
23
+ expect(() => {
24
+ assertStringStartsWith("hello", "");
25
+ }).not.toThrow();
26
+ });
27
+ it("is case sensitive", () => {
28
+ expect(() => {
29
+ assertStringStartsWith("Hello World", "hello");
30
+ }).toThrow('Expected string "Hello World" to start with "hello", but it did not.');
31
+ });
32
+ it("works with exact match", () => {
33
+ expect(() => {
34
+ assertStringStartsWith("hello", "hello");
35
+ }).not.toThrow();
36
+ });
37
+ it("throws when prefix is longer than string", () => {
38
+ expect(() => {
39
+ assertStringStartsWith("hi", "hello");
40
+ }).toThrow('Expected string "hi" to start with "hello", but it did not.');
41
+ });
42
+ });
43
+ describe("stringStartingWith", () => {
44
+ it("matches strings that start with prefix", () => {
45
+ const matcher = stringStartingWith("hello");
46
+ expect(matcher.matches("hello world")).toBe(true);
47
+ expect(matcher.matches("hello")).toBe(true);
48
+ });
49
+ it("does not match strings that do not start with prefix", () => {
50
+ const matcher = stringStartingWith("foo");
51
+ expect(matcher.matches("bar")).toBe(false);
52
+ expect(matcher.matches("bar-foo")).toBe(false);
53
+ expect(matcher.matches("foobar")).toBe(true);
54
+ });
55
+ it("works with empty prefix", () => {
56
+ const matcher = stringStartingWith("");
57
+ expect(matcher.matches("hello")).toBe(true);
58
+ expect(matcher.matches("")).toBe(true);
59
+ });
60
+ it("is case sensitive", () => {
61
+ const matcher = stringStartingWith("hello");
62
+ expect(matcher.matches("Hello World")).toBe(false);
63
+ expect(matcher.matches("hello world")).toBe(true);
64
+ });
65
+ it("works with exact match", () => {
66
+ const matcher = stringStartingWith("hello");
67
+ expect(matcher.matches("hello")).toBe(true);
68
+ });
69
+ it("works when prefix is longer than string", () => {
70
+ const matcher = stringStartingWith("hello");
71
+ expect(matcher.matches("hi")).toBe(false);
72
+ });
73
+ it("does not match non-string values", () => {
74
+ const matcher = stringStartingWith("foo");
75
+ expect(matcher.matches(null)).toBe(false);
76
+ expect(matcher.matches(undefined)).toBe(false);
77
+ expect(matcher.matches(123)).toBe(false);
78
+ expect(matcher.matches(true)).toBe(false);
79
+ });
80
+ it("describes the matcher", () => {
81
+ const matcher = stringStartingWith("foo");
82
+ expect(desc(matcher)).toBe('string starting with "foo"');
83
+ });
84
+ it("represents the matcher", () => {
85
+ const matcher = stringStartingWith("foobar");
86
+ expect(repr(matcher)).toBe('"foobar…"');
87
+ });
88
+ });
89
+ });
90
+ //# sourceMappingURL=string-starts-with.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-starts-with.test.js","sourceRoot":"","sources":["../../../src/assert/string-starts-with/string-starts-with.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAExD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC,OAAO,CACR,oEAAoE,CACrE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC,OAAO,CACR,sEAAsE,CACvE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,GAAG,EAAE;gBACV,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=throws-error.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throws-error.test.d.ts","sourceRoot":"","sources":["../../../src/assert/throws-error/throws-error.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assertThrowsError } from "./throws-error.assert.js";
3
+ import { AssertionError } from "../../assertion-error.js";
4
+ describe("throws-error", () => {
5
+ it("returns the error when function throws an Error", () => {
6
+ const error = assertThrowsError(() => {
7
+ throw new Error("test error");
8
+ });
9
+ expect(error).toBeInstanceOf(Error);
10
+ expect(error.message).toBe("test error");
11
+ });
12
+ it("works with different Error types", () => {
13
+ const error = assertThrowsError(() => {
14
+ throw new TypeError("type error");
15
+ });
16
+ expect(error).toBeInstanceOf(TypeError);
17
+ expect(error.message).toBe("type error");
18
+ });
19
+ it("throws when function does not throw", () => {
20
+ expect(() => {
21
+ assertThrowsError(() => {
22
+ return 42;
23
+ });
24
+ }).toThrow(AssertionError);
25
+ });
26
+ it("throws when function throws a non-Error value", () => {
27
+ expect(() => {
28
+ assertThrowsError(() => {
29
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
30
+ throw "string error";
31
+ });
32
+ }).toThrow(AssertionError);
33
+ });
34
+ it("throws when function throws null", () => {
35
+ expect(() => {
36
+ assertThrowsError(() => {
37
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
38
+ throw null;
39
+ });
40
+ }).toThrow(AssertionError);
41
+ });
42
+ it("throws when function throws an object", () => {
43
+ expect(() => {
44
+ assertThrowsError(() => {
45
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
46
+ throw { message: "not an error" };
47
+ });
48
+ }).toThrow(AssertionError);
49
+ });
50
+ it("uses custom message when function does not throw", () => {
51
+ expect(() => {
52
+ assertThrowsError(() => {
53
+ /* empty */
54
+ }, "Custom message");
55
+ }).toThrow("Custom message");
56
+ });
57
+ it("uses custom message when function throws non-Error", () => {
58
+ expect(() => {
59
+ assertThrowsError(() => {
60
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
61
+ throw "string";
62
+ }, "Custom message");
63
+ }).toThrow("Custom message");
64
+ });
65
+ it("captures ReferenceError", () => {
66
+ const error = assertThrowsError(() => {
67
+ throw new ReferenceError("test reference error");
68
+ });
69
+ expect(error).toBeInstanceOf(Error);
70
+ expect(error).toBeInstanceOf(ReferenceError);
71
+ expect(error.message).toBe("test reference error");
72
+ });
73
+ });
74
+ //# sourceMappingURL=throws-error.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throws-error.test.js","sourceRoot":"","sources":["../../../src/assert/throws-error/throws-error.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=throws-error-async.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throws-error-async.test.d.ts","sourceRoot":"","sources":["../../../src/assert/throws-error-async/throws-error-async.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assertThrowsErrorAsync } from "./throws-error-async.assert.js";
3
+ import { AssertionError } from "../../assertion-error.js";
4
+ describe("throws-error-async", () => {
5
+ it("returns the error when async function throws an Error", async () => {
6
+ const error = await assertThrowsErrorAsync(async () => {
7
+ await Promise.resolve();
8
+ throw new Error("test error");
9
+ });
10
+ expect(error).toBeInstanceOf(Error);
11
+ expect(error.message).toBe("test error");
12
+ });
13
+ it("works with different Error types", async () => {
14
+ const error = await assertThrowsErrorAsync(async () => {
15
+ await Promise.resolve();
16
+ throw new TypeError("type error");
17
+ });
18
+ expect(error).toBeInstanceOf(TypeError);
19
+ expect(error.message).toBe("type error");
20
+ });
21
+ it("throws when async function does not throw", async () => {
22
+ await expect(assertThrowsErrorAsync(async () => {
23
+ await Promise.resolve();
24
+ return 42;
25
+ })).rejects.toThrow(AssertionError);
26
+ });
27
+ it("throws when async function throws a non-Error value", async () => {
28
+ await expect(assertThrowsErrorAsync(async () => {
29
+ await Promise.resolve();
30
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
31
+ throw "string error";
32
+ })).rejects.toThrow(AssertionError);
33
+ });
34
+ it("throws when async function throws null", async () => {
35
+ await expect(assertThrowsErrorAsync(async () => {
36
+ await Promise.resolve();
37
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
38
+ throw null;
39
+ })).rejects.toThrow(AssertionError);
40
+ });
41
+ it("throws when async function throws an object", async () => {
42
+ await expect(assertThrowsErrorAsync(async () => {
43
+ await Promise.resolve();
44
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
45
+ throw { message: "not an error" };
46
+ })).rejects.toThrow(AssertionError);
47
+ });
48
+ it("uses custom message when async function does not throw", async () => {
49
+ await expect(assertThrowsErrorAsync(async () => {
50
+ await Promise.resolve();
51
+ }, "Custom message")).rejects.toThrow("Custom message");
52
+ });
53
+ it("uses custom message when async function throws non-Error", async () => {
54
+ await expect(assertThrowsErrorAsync(async () => {
55
+ await Promise.resolve();
56
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
57
+ throw "string";
58
+ }, "Custom message")).rejects.toThrow("Custom message");
59
+ });
60
+ });
61
+ //# sourceMappingURL=throws-error-async.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throws-error-async.test.js","sourceRoot":"","sources":["../../../src/assert/throws-error-async/throws-error-async.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=throws-error-like.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throws-error-like.test.d.ts","sourceRoot":"","sources":["../../../src/assert/throws-error-like/throws-error-like.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assertThrowsErrorLike } from "./throws-error-like.assert.js";
3
+ import { AssertionError } from "../../assertion-error.js";
4
+ import vm from "node:vm";
5
+ describe("throws-error-like", () => {
6
+ it("returns the error when function throws an Error", () => {
7
+ const errorLike = assertThrowsErrorLike(() => {
8
+ throw new Error("test error");
9
+ });
10
+ expect(errorLike).toBeInstanceOf(Error);
11
+ expect(errorLike.message).toBe("test error");
12
+ });
13
+ it("returns the error when function throws an object with name and message", () => {
14
+ const errorLike = assertThrowsErrorLike(() => {
15
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
16
+ throw { name: "CustomError", message: "custom error" };
17
+ });
18
+ expect(errorLike.name).toBe("CustomError");
19
+ expect(errorLike.message).toBe("custom error");
20
+ });
21
+ it("throws when function does not throw", () => {
22
+ expect(() => {
23
+ assertThrowsErrorLike(() => {
24
+ return 42;
25
+ });
26
+ }).toThrow(AssertionError);
27
+ });
28
+ it("throws when function throws a string", () => {
29
+ expect(() => {
30
+ assertThrowsErrorLike(() => {
31
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
32
+ throw "string error";
33
+ });
34
+ }).toThrow(AssertionError);
35
+ });
36
+ it("throws when function throws null", () => {
37
+ expect(() => {
38
+ assertThrowsErrorLike(() => {
39
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
40
+ throw null;
41
+ });
42
+ }).toThrow(AssertionError);
43
+ });
44
+ it("throws when function throws undefined", () => {
45
+ expect(() => {
46
+ assertThrowsErrorLike(() => {
47
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
48
+ throw undefined;
49
+ });
50
+ }).toThrow(AssertionError);
51
+ });
52
+ it("throws when function throws an object without name", () => {
53
+ expect(() => {
54
+ assertThrowsErrorLike(() => {
55
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
56
+ throw { message: "no name" };
57
+ });
58
+ }).toThrow(AssertionError);
59
+ });
60
+ it("throws when function throws an object without message", () => {
61
+ expect(() => {
62
+ assertThrowsErrorLike(() => {
63
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
64
+ throw { name: "NoMessage" };
65
+ });
66
+ }).toThrow(AssertionError);
67
+ });
68
+ it("throws when function throws an object with non-string name", () => {
69
+ expect(() => {
70
+ assertThrowsErrorLike(() => {
71
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
72
+ throw { name: 123, message: "test" };
73
+ });
74
+ }).toThrow(AssertionError);
75
+ });
76
+ it("throws when function throws an object with non-string message", () => {
77
+ expect(() => {
78
+ assertThrowsErrorLike(() => {
79
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
80
+ throw { name: "Test", message: 456 };
81
+ });
82
+ }).toThrow(AssertionError);
83
+ });
84
+ it("uses custom message when function does not throw", () => {
85
+ expect(() => {
86
+ assertThrowsErrorLike(() => {
87
+ /* empty */
88
+ }, "Custom message");
89
+ }).toThrow("Custom message");
90
+ });
91
+ it("uses custom message when function throws non-Error-like", () => {
92
+ expect(() => {
93
+ assertThrowsErrorLike(() => {
94
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
95
+ throw "string";
96
+ }, "Custom message");
97
+ }).toThrow("Custom message");
98
+ });
99
+ it("captures ReferenceError", () => {
100
+ const errorLike = assertThrowsErrorLike(() => {
101
+ throw new ReferenceError("test reference error");
102
+ });
103
+ expect(errorLike).toBeInstanceOf(Error);
104
+ expect(errorLike).toBeInstanceOf(ReferenceError);
105
+ expect(errorLike.message).toBe("test reference error");
106
+ });
107
+ it("works with custom Error subclass", () => {
108
+ class CustomError extends Error {
109
+ constructor(message) {
110
+ super(message);
111
+ this.name = "CustomError";
112
+ }
113
+ }
114
+ const errorLike = assertThrowsErrorLike(() => {
115
+ throw new CustomError("custom error message");
116
+ });
117
+ expect(errorLike).toBeInstanceOf(Error);
118
+ expect(errorLike).toBeInstanceOf(CustomError);
119
+ expect(errorLike.message).toBe("custom error message");
120
+ });
121
+ it("returns stack trace if present", () => {
122
+ const errorLike = assertThrowsErrorLike(() => {
123
+ throw new Error("test");
124
+ });
125
+ expect(errorLike).toHaveProperty("stack");
126
+ });
127
+ it("works with Error-like object that has stack property", () => {
128
+ const errorLike = assertThrowsErrorLike(() => {
129
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
130
+ throw {
131
+ name: "CustomError",
132
+ message: "custom error",
133
+ stack: "stack trace",
134
+ };
135
+ });
136
+ expect(errorLike.stack).toBe("stack trace");
137
+ });
138
+ it("works with Error subtype from inside vm", () => {
139
+ const errorLike = assertThrowsErrorLike(() => {
140
+ const script = new vm.Script("foobar;");
141
+ script.runInContext(vm.createContext({
142
+ console,
143
+ }));
144
+ });
145
+ expect(errorLike).not.toBeInstanceOf(ReferenceError);
146
+ expect(errorLike).not.toBeInstanceOf(Error);
147
+ expect(errorLike.name).toBe("ReferenceError");
148
+ expect(errorLike.message).toBe("foobar is not defined");
149
+ });
150
+ });
151
+ //# sourceMappingURL=throws-error-like.test.js.map