1 # This file provides a basic assertion library.
3 createError = (description, message = '') ->
4 formattedMessage = if message then "\nMessage: #{message}" else ''
5 error = new Error("Expected #{description}.#{formattedMessage}")
6 error.stack = error.stack.split('\n')[1..]
11 string = JSON.stringify(value)
13 (string == '{}' and Object::toString.call(value) != '[object Object]')
17 arrayEqual = (actual, expected, message = '') ->
18 unless Array.isArray(actual) and Array.isArray(expected)
20 "two arrays to compare. Got: #{format(actual)} and #{format(expected)}",
23 unless actual.length == expected.length and
24 actual.every((actualItem, index) -> actualItem == expected[index])
26 "#{format(actual)} to array-equal #{format(expected)}",
30 equal = (actual, expected, message = '') ->
31 return if actual == expected
32 throw createError("#{format(actual)} to equal #{format(expected)}", message)
34 notEqual = (actual, expected, message = '') ->
35 return if actual != expected
37 "#{format(actual)} NOT to equal #{format(expected)}",
41 ok = (actual, message = '') ->
43 throw createError("#{format(actual)} to be truthy", message)
45 throws = (regex, badValue, fn) ->
48 unless error.message.startsWith(start)
50 "thrown error message #{format(error.message)} to start with
53 unless error.message.endsWith(end)
55 "thrown error message #{format(error.message)} to end with
57 unless regex.test(error.message)
59 "thrown error message #{format(error.message)} to match the regex
62 throw createError("function to throw, but it did not: #{format(fn)}")