Guest User

Untitled

a guest
Jul 18th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.69 KB | None | 0 0
  1. (ns midje.util.t-checker-collection
  2. (:use [midje.sweet])
  3. (:use [midje.test-util]))
  4.  
  5. (fact "left-hand-side: sequentials that are to contain things"
  6. [3 4 5 700] => (contains [4 5 700])
  7. ( (contains [4 5 700]) [4 700 5]) => falsey
  8. ( (contains [4 5 700]) [4 5 'hi 700]) => falsey
  9.  
  10. ['hi 700 5 4] => (contains [4 5 700] :in-any-order)
  11. ( (contains [4 5 700] :in-any-order) [4 5 'hi 700]) => falsey
  12.  
  13. [4 5 'hi 700] => (contains [4 5 700] :gaps-ok)
  14. ( (contains [4 5 700] :gaps-ok) [4 700 'hi' 5]) => falsey
  15.  
  16. [4 700 5] => (contains [4 5 700] :gaps-ok :in-any-order)
  17. [4 5 'hi 700] => (contains [4 5 700] :in-any-order :gaps-ok)
  18. [700 'hi 4 5 'hi] => (contains [4 5 700] :in-any-order :gaps-ok)
  19.  
  20. ;; containing sets
  21. [700 4 5] => (contains #{4 5 700})
  22. [700 4 5] => (contains #{4 5 700} :in-any-order) ; redundant
  23. [700 [] 4 5] => (contains #{4 5 700} :gaps-ok)
  24. [700 [] 4 5] => (contains #{4 5 700} :gaps-ok :in-any-order) ; redundant
  25.  
  26. ;; containing maps
  27. [ {:a 1} "irrelevant"] => (contains {:a 1})
  28.  
  29. ;; Just
  30. [1 2 3] => (just [1 2 3])
  31. ( (just [1 2 3 4]) [1 2 3]) => falsey
  32. ( (just [1 2 3]) [1 2 3 4]) => falsey
  33.  
  34. [1 2 3] => (just [odd? even? odd?])
  35.  
  36. [1 3 2] => (just [1 2 3] :in-any-order)
  37. [1 3 2] => (just #{1 2 3})
  38. [1 3 2] => (just [1 2 3] :gaps-ok :in-any-order) ;; silly
  39. [1 3 2] => (just #{1 2 3} :gaps-ok)
  40.  
  41.  
  42. [1 2 3] => (has-prefix [1 2])
  43. ( (has-prefix [2 1]) [1 2 3]) => false
  44. [1 2 3] => (has-prefix [2 1] :in-any-order)
  45. [1 2 3] => (has-prefix #{2 1})
  46. [1 2 3] => (has-prefix #{2 1} :gaps-ok) ; silly
  47.  
  48. [1 2 3] => (has-suffix [even? odd?])
  49. ( (has-suffix [odd? even?]) [1 2 3]) => falsey
  50. [1 2 3] => (has-suffix [odd? even?] :in-any-order)
  51. [1 2 3] => (has-suffix #{even? odd?})
  52. [1 2 3] => (has-suffix #{odd? even?} :gaps-ok) ; silly
  53.  
  54. ;; Singletons
  55. [700 4 5] => (contains 4)
  56. [4] => (just 4)
  57. [4] => (has-prefix 4)
  58. [4] => (has-suffix 4)
  59.  
  60. [4 4 1] => (has some odd?)
  61. [1 3 5] => (has every? odd?)
  62. ( (has some odd?) [34 34 88]) => falsey
  63. ( (has every? odd?) [1 3 44]) => falsey
  64.  
  65. ;; old bugs
  66. ( (contains [true]) [1 2]) => falsey
  67. ( (contains ['a]) [1 2]) => falsey
  68. )
  69.  
  70. (fact "left-hand-side: actual return values that are strings"
  71. "abc" => (contains "bc")
  72. ( (contains "bc") "bd") => falsey
  73.  
  74. "abc" => (contains "ac" :gaps-ok)
  75. "abc" => (contains "ba" :in-any-order)
  76.  
  77. "abc" => (just "abc")
  78. ( (just "ab") "abc") => falsey
  79.  
  80. ( (just "ac" :gaps-ok) "abc") => falsey
  81. "abc" => (just "cba" :in-any-order)
  82. ( (just "cba" :in-any-order) "ab") => falsey
  83. ( (just "cba" :in-any-order) "abcd") => falsey
  84.  
  85. "abc" => (has-suffix "bc")
  86. "abc" => (has-prefix "ab")
  87. ( (has-suffix "ac") "abc") => falsey
  88. ( (has-suffix "ap") "abc") => falsey
  89.  
  90. "123" => (has every? #(Character/isDigit %))
  91. ( (has every? #(Character/isDigit %)) "23a") => falsey
  92.  
  93. ;; Comparisons to regular expressions
  94. " 1" => #"\d"
  95.  
  96. " 3" => (contains #"\d")
  97. ( (contains #"\d") " ") => falsey
  98.  
  99. "123" => (just #"\d\d\d")
  100. ( (just #"\d\d\d") "1234") => falsey
  101. ( (just #"\d\d\d") "12") => falsey
  102.  
  103. "12x" => (has-prefix #"\d+")
  104. "x12" => (has-suffix #"\d+")
  105.  
  106. ( (has-suffix #"\d+") "12x") => falsey
  107. ( (has-prefix #"\d+") "x12") => falsey
  108.  
  109. (chatty-falsehood-to-map ( (contains #"a" :in-any-order) "a"))
  110. => (contains {:actual "a", :notes (just #"regular expression.*:in-any-order")})
  111. ["a"] => (contains #"a" :in-any-order) ; this is OK because the singleton becomes a vector
  112.  
  113. (chatty-falsehood-to-map ( (contains #"a" :gaps-ok) "a"))
  114. => (contains {:actual "a", :notes (just #"regular expression.*:gaps-ok")})
  115. ["a"] => (contains #"a" :gaps-ok) ; this is OK because the singleton becomes a vector
  116.  
  117. ;; collections compared to strings or regular expressions
  118. ["a" "b" "c"] => (contains "b")
  119. ( (contains "b") ["a" "c"]) => falsey
  120. ["a" "b" "c"] => (contains ["b"])
  121.  
  122. ["a" "b" "c"] => (contains #"b+")
  123. ( (contains #"b+") ["a" "c"]) => falsey
  124. ["a" "b" "c"] => (contains [#"b+"])
  125. ( (contains #"b+") ["a" "c"]) => falsey
  126.  
  127. ["b"] => (just "b")
  128. ( (just "b") ["b" "c"]) => falsey
  129. ["b"] => (just ["b"])
  130.  
  131. ["b"] => (just #"b+")
  132. ( (just #"b+") ["b" "c"]) => falsey
  133. ["b"] => (just [#"b+"])
  134.  
  135. ["b" "c"] => (has-prefix "b")
  136. ( (has-prefix "b") ["c" "b" "c"]) => falsey
  137. ["b" "c"] => (has-prefix ["b"])
  138.  
  139. ["b" "c"] => (has-prefix #"b+")
  140. ( (has-prefix #"b+") ["" "c"]) => falsey
  141. ["b" "c"] => (has-prefix [#"b+"])
  142.  
  143. ["a" "b"] => (has-suffix "b")
  144. ( (has-suffix "b") ["b" "c"]) => falsey
  145. ["a" "b"] => (has-suffix ["b"])
  146.  
  147. ["a" "b"] => (has-suffix #"b+")
  148. ( (has-suffix #"b+") ["b" "c"]) => falsey
  149. ["a" "b"] => (has-suffix [#"b+"])
  150.  
  151. ;; Strings and characters
  152. "s" => (just \s)
  153. ( (just \s) "as") => falsey
  154. "s" => (contains \s)
  155. ( (contains \s) "family") => falsey
  156. "as" => (contains [\s \a] :in-any-order)
  157. ( (contains [\s \a] :in-any-order) "af") => falsey
  158. "afs" => (contains [\s \a] :in-any-order :gaps-ok)
  159. ( (contains [\s \a] :in-any-order :gaps-ok) "af S") => falsey
  160.  
  161. ( (just "ab") [\a \b]) => falsey
  162. [\a \b] => (just (vec "ab"))
  163.  
  164. ( (just "ab") "AB") => falsey
  165. "AB" => #"(?i)ab"
  166.  
  167. ;; Just to check
  168. ( (contains "a") [1]) => falsey
  169. ( (contains #"a") [1]) => falsey
  170. ( (just "a") [1]) => falsey
  171. ( (just #"a") [1]) => falsey
  172. ( (has-prefix "a") [1]) => falsey
  173. ( (has-prefix #"a") [1]) => falsey
  174. ( (has-suffix "a") [1]) => falsey
  175. ( (has-suffix #"a") [1]) => falsey
  176. )
  177.  
  178. (fact "left-hand-side: sets to contain things"
  179. #{1 2 3} => (contains #{1 2 3})
  180. #{1 2 3} => (contains [1 2 3])
  181.  
  182. #{"1" "12" "123"} => (contains [#"1" #"2" #"3"])
  183. #{"1" "12" "123"} => (contains [#"1" #"2" #"3"])
  184. #{"1" "12" "123"} => (contains #{#"1" #"2"})
  185. ( (contains #{#"1" #"2" #"3"}) #{"1" "12"}) => falsey
  186. ( (contains #{#"1" #"3"}) #{"1" "12"}) => falsey
  187.  
  188. #{"1" "12" "123"} => (contains [#"1" #"2" #"3"] :in-any-order) ; silly
  189. #{"1" "12" "123"} => (contains #{#"1" #"2" #"3"} :gaps-ok) ; silly
  190.  
  191. #{"1" odd? 1} => (just [#"1" 1 (exactly odd?)])
  192. #{"1" "12" "123"} => (just [#"1" #"2" #"3"])
  193. ( (just #{#"1" #"2" #"3"}) #{"1" "12" "4"}) => falsey
  194. ( (just #{#"1" #"2" #"3"}) #{"1" "12" "123" "1234"}) => falsey
  195.  
  196. #{"1" "12" "123"} => (just [#"1" #"2" #"3"] :in-any-order) ; silly
  197. #{"1" "12" "123"} => (just #{#"1" #"2" #"3"} :gaps-ok) ; silly
  198.  
  199. ;; containing maps
  200. #{ {:a 1} "irrelevant"} => (contains {:a 1})
  201.  
  202. #{1} => (contains 1)
  203. #{1} => (just 1)
  204.  
  205. (chatty-falsehood-to-map ( (has-prefix 1) #{1}))
  206. => (contains {:actual #{1} :notes ["Sets don't have prefixes."]})
  207. (chatty-falsehood-to-map ( (has-suffix 1) #{1}))
  208. => (contains {:actual #{1} :notes ["Sets don't have suffixes."]})
  209. (chatty-falsehood-to-map ( (has-prefix 1) {:a 1}))
  210. => (contains {:actual {:a 1} :notes ["Maps don't have prefixes."]})
  211. (chatty-falsehood-to-map ( (has-suffix 1) {:a 1}))
  212. => (contains {:actual {:a 1} :notes ["Maps don't have suffixes."]})
  213. )
  214.  
  215. (fact "left-hand-side: maps"
  216. {:a 1, :b 2} => (contains {:a 1, :b 2})
  217. {:a "1", :b "2", :c "3"} => (contains {:a "1", :b "2"})
  218.  
  219. ( (contains {:a 1, :b 2, :c 2}) {:a 1, :b 2}) => falsey
  220. ( (contains {:a 1, :c 2}) {:a 1, :b 2}) => falsey
  221. ( (contains {:a 1, :b 'not-2}) {:a 1, :b 2}) => falsey
  222.  
  223. {:a 1, :b 2} => (contains {:a odd?, :b even?})
  224. {:a "1", :b "2"} => (contains {:a #"1", :b #"2"})
  225. {:a 1, :b 2} => (contains {:a odd?})
  226. ( (contains {:a even?}) {:a 1, :b 2}) => falsey
  227.  
  228. {:a 1, :b 2} => (just {:a odd?, :b even?})
  229. ( (just {:a odd?}) {:a 1, :b 2}) => falsey
  230. ( (just {:a even?}) {:a 1}) => falsey
  231. ( (just {:a even?}) {nil 1}) => falsey
  232.  
  233. ;; extended-equality isn't recursive, so...
  234. ;; ... while this works without lower-level annotation
  235. {:actual-found ["12" "1" "123"] } => (contains {:actual-found ["12" "1" "123"] })
  236. ;; ... this requires it:
  237. {:expected-found [#"2" #"1" #"3"] }
  238. => (contains {:expected-found (just [#"2" #"1" #"3"]) })
  239.  
  240. {} => (contains {})
  241. {nil nil} => (contains {})
  242. {nil nil} => (contains {nil nil})
  243. ( (contains {nil nil}) {nil true}) => falsey
  244. ( (contains {nil nil}) {true nil}) => falsey
  245.  
  246. ;; Map Entries
  247. {:a 1} => (contains [ (find {:a 1} :a) ])
  248. ((contains [ (find {:a 1} :a) ]) {:a 2}) => falsey
  249.  
  250. {:a 1} => (just [ (find {:a 1} :a) ])
  251. {:a 1} => (just [ [:a 1] ])
  252. ( (just [ [:a 1] ]) {:a 1, :b 1}) => falsey
  253.  
  254. (chatty-falsehood-to-map ( (contains [:a 1]) {:a 1}))
  255. => (contains {:actual {:a 1} :notes (just #"\{:a 1\} is a map.*\[:a 1\]")})
  256. ;; By the way, that means it'll be counted as false:
  257. ( (contains [:a 1]) {:a 1}) => chatty-checker-falsehood?
  258.  
  259. ( (contains [1]) {:a 1}) => (contains {:actual {:a 1}
  260. :notes (just #"\{:a 1\} is a map.*\[1\]")})
  261. ( (contains 1) {:a 1}) => (contains {:actual {:a 1}
  262. :notes (just #"\{:a 1\} is a map.*1")})
  263. ((contains [:k :v]) {:k :v}) => (contains {:actual {:k :v}
  264. :notes (just #"should look like map entries")})
  265.  
  266. ;; Quantifiers
  267. {:a 1, :b 5, :c 3} => (has every? odd?)
  268. )
  269.  
  270. (facts "where actual values are of wrong type for legitimate expected"
  271.  
  272. (chatty-falsehood-to-map ( (just "string") 1))
  273. => (contains {:actual 1})
  274. (chatty-falsehood-to-map ( (just {:a 1}) 1))
  275. => (contains {:actual 1 :notes (just #"compare 1.*to \{:a 1\}")})
  276. (chatty-falsehood-to-map ( (contains \s) 1))
  277. => (contains {:actual 1 :notes (just #"compare 1.*to \\s")})
  278. ( (contains [1 2]) 1)
  279. => (contains {:actual 1 :notes (just #"compare 1.*to \[1 2\]")})
  280.  
  281. (chatty-falsehood-to-map ( (just #"ab") 1))
  282. => (contains {:actual 1 :notes (just #"#\"ab\" can't be used on 1")})
  283. (chatty-falsehood-to-map ( (contains #"ab") 1))
  284. => (contains {:actual 1 :notes (just #"#\"ab\" can't be used on 1")})
  285. (chatty-falsehood-to-map ( (has-prefix #"ab") 1))
  286. => (contains {:actual 1 :notes (just #"#\"\^ab\" can't be used on 1")})
  287. (chatty-falsehood-to-map ( (has-suffix #"ab") 1))
  288. => (contains {:actual 1 :notes (just #"#\"ab\$\" can't be used on 1")})
  289.  
  290. (chatty-falsehood-to-map ( (contains {:a 1, :b 2}) {:a 1}))
  291. => (contains {:actual {:a 1} :notes (just "Best match found: {:a 1}.")})
  292. (chatty-falsehood-to-map ( (just {:a 1, :b 2}) {:a 1}))
  293. => (contains {:actual {:a 1} :notes (just #"Expected two elements.*one")})
  294. (chatty-falsehood-to-map ( (contains {:a {:b 1}}) {:a 1}) )
  295. => (contains {:actual {:a 1} :notes (just "Best match found: {}.")})
  296. (chatty-falsehood-to-map ( (contains {:a odd?, :f odd? :g odd?}) {:f 3, :g 6, :a 1}) )
  297. => (contains {:actual {:f 3, :g 6, :a 1}
  298. :notes (just [#"Best match found: \{:a 1, :f 3\}\."
  299. #"It matched: \{:a odd\?, :f odd\?\}\."])})
  300. (chatty-falsehood-to-map ( (contains :a) {:a 1}))
  301. => (contains {:actual {:a 1}, :notes (just #"\{:a 1\}.*:a.*map entries")})
  302. )
  303.  
  304. (facts "about the notes given to reporting functions"
  305. "functions and such are printed nicely in the actual match section"
  306. (chatty-falsehood-to-map ( (contains [#"1" #"1+" #"1+2"]) [#"1" #"1+"]))
  307. => (contains {:notes (contains #"Best match.*\[#\"1\" #\"1\+\"\]")})
  308.  
  309. ; It'd be nice to make all kinds of recursive function printing work nicely.
  310. ; [odd? even?] => (contains [(exactly odd?) (exactly odd?)])
  311.  
  312. "checkers are printed nicely in the expected matched: section"
  313. (chatty-falsehood-to-map ( (contains [5 (exactly 4)] :in-any-order) [1 2 4]))
  314. => (contains {:notes (contains #"It matched.*\[\(exactly 4\)\]")})
  315.  
  316. (chatty-falsehood-to-map ( (contains [(just 3) 6]) [[3] 5]))
  317. => (contains {:notes (contains #"It matched.*\[\(just 3\)\]")})
  318.  
  319. (chatty-falsehood-to-map ( (contains [(contains 3) 6]) [[3] 5]))
  320. => (contains {:notes (contains #"It matched.*\[\(contains 3\)\]")})
  321.  
  322. (chatty-falsehood-to-map ( (contains [(has-prefix 3) 6]) [[3] 5]))
  323. => (contains {:notes (contains #"It matched.*\[\(has-prefix 3\)\]")})
  324.  
  325. (chatty-falsehood-to-map ( (contains [(has-suffix 3) 6]) [[3] 5]))
  326. => (contains {:notes (contains #"It matched.*\[\(has-suffix 3\)\]")})
  327.  
  328. (chatty-falsehood-to-map ( (contains [#"fo+\[" "ba"]) ["foo[" "bar"]))
  329. => (contains {:notes (contains #"It matched.*\[#\"fo\+\\\[\"\]")})
  330.  
  331. (chatty-falsehood-to-map ( (contains [1 "1\"2" [even?] odd?]) [1 "1\"2" [3]]))
  332. => (contains {:notes (contains #"It matched.*\[1 \"1\\\"2\"\]")})
  333.  
  334. "Proper grammar for just errors"
  335. (chatty-falsehood-to-map ( (just 1) [1 2]))
  336. => (contains {:notes ["Expected one element. There were two."]})
  337. (chatty-falsehood-to-map ( (just 1) []))
  338. => (contains {:notes ["Expected one element. There were zero."]})
  339. (chatty-falsehood-to-map ( (just []) [1]))
  340. => (contains {:notes ["Expected zero elements. There was one."]})
  341. (chatty-falsehood-to-map ( (just [1 2]) [1]))
  342. => (contains {:notes ["Expected two elements. There was one."]})
  343. (chatty-falsehood-to-map ( (just #{1}) [1 1]))
  344. => (contains {:notes ["Expected one element. There were two."]})
  345.  
  346.  
  347. (chatty-falsehood-to-map ((has-prefix '(a b c)) '(a)))
  348. => (contains {:notes ["A collection with one element cannot match a prefix of size three."]})
  349.  
  350. (chatty-falsehood-to-map ((has-suffix '(1)) '()))
  351. => (contains {:notes ["A collection with zero elements cannot match a suffix of size one."]})
  352. )
  353.  
  354. (facts "where expected values are of wrong type for legitimate actual"
  355. (chatty-falsehood-to-map ( (just "hi") '(1)))
  356. => (contains {:actual (list 1) :notes (just #"\[\]")})
  357. (chatty-falsehood-to-map ( (just (atom 0)) '(0)))
  358. => (contains {:actual '(0) :notes (just #"\[\]")})
  359. (chatty-falsehood-to-map ( (contains :a) {:a 1}))
  360. => (contains {:actual {:a 1} :notes (just #"\{:a 1\}.*:a.*map entries")})
  361. (chatty-falsehood-to-map ( (contains 1) {:a 1}))
  362. => (contains {:actual {:a 1} :notes (just #"\{:a 1\}.*1.*map entries")})
  363. )
  364.  
  365. (fact "Actual result shown is the original collection"
  366. ;; This prints like this: {:actual [1], :notes (Best match found: [])}
  367. (str (:actual ( (contains (atom 0)) #{1}))) => "#{1}"
  368. (str (:actual ( (just (atom 0)) #{1}))) => "#{1}"
  369. (str (:actual ( (has-suffix [\a \b \c]) "many"))) => "many"
  370. (str (:actual ( (has-prefix 5) [#{{1 2}} 2 3 4]))) => "[#{{1 2}} 2 3 4]"
  371. )
Add Comment
Please, Sign In to add comment