You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							160 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							160 lines
						
					
					
						
							5.4 KiB
						
					
					
				| var duck = require("../"); | |
| 
 | |
| var testMatcher = function(options) { | |
|     return function(test) { | |
|         var matcher = options.matcher; | |
|         var description = options.description; | |
|         var positives = options.positives; | |
|         var negatives = options.negatives; | |
|          | |
|         test.equal(matcher.describeSelf(), description); | |
|          | |
|         positives.forEach(function(positive) { | |
|             test.same(true, matcher.matches(positive)); | |
|             var result = matcher.matchesWithDescription(positive); | |
|             test.same(true, result.matches); | |
|             test.same("", result.description); | |
|         }); | |
|         negatives.forEach(function(negative) { | |
|             test.same(false, matcher.matches(negative.value)); | |
|             test.same(negative.description, matcher.describeMismatch(negative.value)); | |
|             var result = matcher.matchesWithDescription(negative.value); | |
|             test.same(false, result.matches); | |
|             test.same(negative.description, result.description); | |
|         }); | |
|          | |
|         test.done(); | |
|     }; | |
| }; | |
| 
 | |
| exports.isMatchesPrimitiveValues = testMatcher({ | |
|     matcher: duck.is(1), | |
|     description: "1", | |
|     positives: [1], | |
|     negatives: [ | |
|         {value: 2, description: "was 2"}, | |
|         {value: "1", description: "was '1'"}, | |
|         {value: null, description: "was null"} | |
|     ] | |
| }); | |
| 
 | |
| exports.isMatchesObjectUsingIsEqual = testMatcher({ | |
|     matcher: duck.is({}), | |
|     description: "{}", | |
|     positives: [{}], | |
|     negatives: [ | |
|         {value: {hair: "none"}, description: "was { hair: 'none' }"} | |
|     ] | |
| }); | |
| 
 | |
| exports.isDoesNothingToMatchers = testMatcher({ | |
|     matcher: duck.is(duck.is(1)), | |
|     description: "1", | |
|     positives: [1], | |
|     negatives: [ | |
|         {value: 2, description: "was 2"}, | |
|         {value: "1", description: "was '1'"}, | |
|         {value: null, description: "was null"} | |
|     ] | |
| }); | |
| 
 | |
| exports.isObjectMatchesValuesExactly = testMatcher({ | |
|     matcher: duck.isObject({ | |
|         name: "Bob", | |
|         age: 24 | |
|     }), | |
|     description: "{\n    age: 24,\n    name: 'Bob'\n}", | |
|     positives: [{name: "Bob", age: 24}], | |
|     negatives: [ | |
|         {value: {name: "Bob"}, description: "missing property: \"age\""}, | |
|         {value: {}, description: "missing property: \"age\"\nmissing property: \"name\""}, | |
|         {value: {name: "bob", age: 24}, description: "value of property \"name\" didn't match:\n    was 'bob'\n    expected 'Bob'"}, | |
|         {value: {name: "Bob", age: 24, hair: "none"}, description: "unexpected property: \"hair\""} | |
|     ] | |
| }); | |
| 
 | |
| exports.isObjectSubDescriptionsAreIndented = testMatcher({ | |
|     matcher: duck.isObject({artist: duck.isObject({name: "Bob"})}), | |
|     description: "{\n    artist: {\n        name: 'Bob'\n    }\n}", | |
|     positives: [], | |
|     negatives: [ | |
|         { | |
|             value: {artist: {name: "Jim"}}, | |
|             description: | |
|                 "value of property \"artist\" didn't match:\n" +  | |
|                 "    value of property \"name\" didn't match:\n" + | |
|                 "        was 'Jim'\n" + | |
|                 "        expected 'Bob'\n" + | |
|                 "    expected {\n" + | |
|                 "        name: 'Bob'\n" + | |
|                 "    }" | |
|         } | |
|     ] | |
| }); | |
| 
 | |
| exports.hasPropertiesBehavesAsIsObjectExceptIgnoresUnexpectedValues = testMatcher({ | |
|     matcher: duck.hasProperties({ | |
|         name: "Bob", | |
|         age: 24 | |
|     }), | |
|     description: "object with properties {\n    age: 24,\n    name: 'Bob'\n}", | |
|     positives: [{name: "Bob", age: 24}, {name: "Bob", age: 24, hair: "none"}], | |
|     negatives: [ | |
|         {value: {name: "Bob"}, description: "missing property: \"age\""}, | |
|         {value: {}, description: "missing property: \"age\"\nmissing property: \"name\""}, | |
|         {value: {name: "bob", age: 24}, description: "value of property \"name\" didn't match:\n    was 'bob'\n    expected 'Bob'"} | |
|     ] | |
| }); | |
| 
 | |
| exports.isArrayMatchesLengthAndIndividualElements = testMatcher({ | |
|     matcher: duck.isArray(["apple", "banana"]), | |
|     description: "['apple', 'banana']", | |
|     positives: [["apple", "banana"]], | |
|     negatives: [ | |
|         {value: [], description: "was of length 0"}, | |
|         {value: ["apple", "banana", "coconut"], description: "was of length 3"}, | |
|         {value: ["apple", "coconut",], description: "element at index 1 didn't match:\n    was 'coconut'\n    expected 'banana'"} | |
|     ] | |
| }); | |
| 
 | |
| exports.isArraySubDescriptionsAreIndented = testMatcher({ | |
|     matcher: duck.isArray([duck.isObject({name: "Bob"})]), | |
|     description: "[{\n    name: 'Bob'\n}]", | |
|     positives: [[{name: "Bob"}]], | |
|     negatives: [ | |
|         { | |
|             value: [{name: "Jim"}], | |
|             description: | |
|                 "element at index 0 didn't match:\n" +  | |
|                 "    value of property \"name\" didn't match:\n" + | |
|                 "        was 'Jim'\n" + | |
|                 "        expected 'Bob'\n" + | |
|                 "    expected {\n" + | |
|                 "        name: 'Bob'\n" + | |
|                 "    }" | |
|         } | |
|     ] | |
| }); | |
| 
 | |
| exports.isArraySubDescriptionsAreIndented = testMatcher({ | |
|     matcher: duck.any, | |
|     description: "<any>", | |
|     positives: [{name: "Bob"}, null, undefined, 0, 1, "Bob", []], | |
|     negatives: [] | |
| }); | |
| 
 | |
| exports.assertReturnsNormallyOnSuccess = function(test) { | |
|     duck.assertThat(42, duck.is(42)); | |
|     test.done(); | |
| }; | |
| 
 | |
| exports.assertRaisesErrorIfAssertionFails = function(test) { | |
|     try { | |
|         duck.assertThat(42, duck.is(43)); | |
|         test.fail("Should throw error"); | |
|     } catch (error) { | |
|         test.equal(error.name, "AssertionError"); | |
|         test.equal(error.message, "Expected 43\nbut was 42"); | |
|     } | |
|     test.done(); | |
| };
 | |
| 
 |