Skip to content

Commit 77a2032

Browse files
Substitute v2-beta: Tests (#231)
* move existing tests to regression folder * add RecordedArguments spec * create Utilities spec
1 parent a4342bf commit 77a2032

28 files changed

+1059
-1030
lines changed

spec/Arguments.spec.ts

Lines changed: 0 additions & 111 deletions
This file was deleted.

spec/RecordedArguments.spec.ts

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import test from 'ava'
2+
import { inspect } from 'util'
3+
4+
import { Arg } from '../src'
5+
import { RecordedArguments } from '../src/RecordedArguments'
6+
7+
const testObject = { 'foo': 'bar' }
8+
const testArray = ['a', 1, true]
9+
10+
// #90: Infinite recursion in deepEqual https://github.com/ffMathy/FluffySpoon.JavaScript.Testing.Faking/blob/master/spec/issues/90.test.ts
11+
const parent = {} as any
12+
parent.child = parent
13+
const root = {} as any
14+
root.path = { to: { nested: root } }
15+
16+
const testFunc = () => { }
17+
const testSymbol = Symbol()
18+
19+
test('records values and classifies them correctly', t => {
20+
const emptyArguments = RecordedArguments.from([])
21+
t.deepEqual(emptyArguments.value, [])
22+
t.is(emptyArguments.argumentsClass, 'plain')
23+
t.is(emptyArguments.hasNoArguments, false)
24+
25+
const primitivesOnlyArguments = RecordedArguments.from([1, 'Substitute', false, testSymbol, undefined, null, testFunc, {}])
26+
t.deepEqual(primitivesOnlyArguments.value, [1, 'Substitute', false, testSymbol, undefined, null, testFunc, {}])
27+
t.is(primitivesOnlyArguments.argumentsClass, 'plain')
28+
t.is(primitivesOnlyArguments.hasNoArguments, false)
29+
30+
const anyArg = Arg.any('any')
31+
const withSingleArgumentArguments = RecordedArguments.from([1, 'Substitute', false, testSymbol, undefined, null, testFunc, {}, anyArg])
32+
t.deepEqual(withSingleArgumentArguments.value, [1, 'Substitute', false, testSymbol, undefined, null, testFunc, {}, anyArg])
33+
t.is(withSingleArgumentArguments.argumentsClass, 'with-predicate')
34+
t.is(withSingleArgumentArguments.hasNoArguments, false)
35+
36+
const allArg = Arg.all()
37+
const allArgumentArguments = RecordedArguments.from([allArg])
38+
t.deepEqual(allArgumentArguments.value, [allArg])
39+
t.is(allArgumentArguments.argumentsClass, 'wildcard')
40+
t.is(allArgumentArguments.hasNoArguments, false)
41+
})
42+
43+
test('creates a valid instance for no arguments', t => {
44+
const args = RecordedArguments.none()
45+
46+
t.is(args.value, undefined)
47+
t.is(args.argumentsClass, undefined)
48+
t.is(args.hasNoArguments, true)
49+
})
50+
51+
test('sorts correctly objects with RecordedArguments', t => {
52+
const plain1 = RecordedArguments.from([])
53+
const plain2 = RecordedArguments.from([1, 2])
54+
const withPredicate1 = RecordedArguments.from([1, Arg.any()])
55+
const withPredicate2 = RecordedArguments.from([Arg.any()])
56+
const wildcard1 = RecordedArguments.from([Arg.all()])
57+
const wildcard2 = RecordedArguments.from([Arg.all()])
58+
59+
const wrapper = (recordedArguments: RecordedArguments[]) => recordedArguments.map(args => ({ recordedArguments: args }))
60+
const sortedArgs1 = RecordedArguments.sort(wrapper([wildcard1, wildcard2, withPredicate1, withPredicate2, plain1, plain2]))
61+
const sortedArgs2 = RecordedArguments.sort(wrapper([wildcard1, withPredicate1, plain1, withPredicate2, wildcard2, plain2]))
62+
63+
t.deepEqual(sortedArgs1, wrapper([plain1, plain2, withPredicate1, withPredicate2, wildcard1, wildcard2]))
64+
t.deepEqual(sortedArgs2, wrapper([plain1, plain2, withPredicate1, withPredicate2, wildcard1, wildcard2]))
65+
})
66+
67+
test('matches correctly with another RecordedArguments instance when none arguments are recorded', t => {
68+
const args = RecordedArguments.none()
69+
70+
t.true(args.match(args))
71+
t.true(args.match(RecordedArguments.none()))
72+
73+
t.false(args.match(RecordedArguments.from([])))
74+
t.false(RecordedArguments.from([]).match(args))
75+
t.false(args.match(RecordedArguments.from([undefined])))
76+
})
77+
78+
test('matches correctly with another RecordedArguments instance when primitive arguments are recorded', t => {
79+
// single
80+
t.true(RecordedArguments.from([]).match(RecordedArguments.from([])))
81+
t.true(RecordedArguments.from(['Substitute']).match(RecordedArguments.from(['Substitute'])))
82+
t.true(RecordedArguments.from([0]).match(RecordedArguments.from([0])))
83+
t.true(RecordedArguments.from([true]).match(RecordedArguments.from([true])))
84+
t.true(RecordedArguments.from([false]).match(RecordedArguments.from([false])))
85+
t.true(RecordedArguments.from([undefined]).match(RecordedArguments.from([undefined])))
86+
t.true(RecordedArguments.from([null]).match(RecordedArguments.from([null])))
87+
t.true(RecordedArguments.from([Symbol.for('test')]).match(RecordedArguments.from([Symbol.for('test')])))
88+
89+
t.false(RecordedArguments.from(['a']).match(RecordedArguments.from(['b'])))
90+
t.false(RecordedArguments.from([1]).match(RecordedArguments.from([2])))
91+
t.false(RecordedArguments.from([true]).match(RecordedArguments.from([false])))
92+
t.false(RecordedArguments.from([undefined]).match(RecordedArguments.from([null])))
93+
t.false(RecordedArguments.from(['1']).match(RecordedArguments.from([1])))
94+
95+
// multi
96+
t.true(RecordedArguments.from([1, 2, 3]).match(RecordedArguments.from([1, 2, 3])))
97+
98+
t.false(RecordedArguments.from([1, 2, 3]).match(RecordedArguments.from([3, 2, 1])))
99+
t.false(RecordedArguments.from([1, 2, 3]).match(RecordedArguments.from([1, 2, 3, 4])))
100+
t.false(RecordedArguments.from([1, 2, 3, 4]).match(RecordedArguments.from([1, 2, 3])))
101+
})
102+
103+
test('matches correctly with another RecordedArguments instance when object arguments are recorded', t => {
104+
// same reference
105+
t.true(RecordedArguments.from([testObject]).match(RecordedArguments.from([testObject])))
106+
t.true(RecordedArguments.from([testArray]).match(RecordedArguments.from([testArray])))
107+
t.true(RecordedArguments.from([testFunc]).match(RecordedArguments.from([testFunc])))
108+
t.true(RecordedArguments.from([parent]).match(RecordedArguments.from([parent])))
109+
t.true(RecordedArguments.from([root]).match(RecordedArguments.from([root])))
110+
111+
// deep equal
112+
const objectWithSelfReference = { a: 1, b: 2 } as any
113+
objectWithSelfReference.c = objectWithSelfReference
114+
const anotherObjectWithSelfReference = { a: 1, b: 2 } as any
115+
anotherObjectWithSelfReference.c = anotherObjectWithSelfReference
116+
117+
t.true(RecordedArguments.from([{ a: 1 }]).match(RecordedArguments.from([{ a: 1 }])))
118+
t.true(RecordedArguments.from([[]]).match(RecordedArguments.from([[]])))
119+
t.true(RecordedArguments.from([[1, 'a']]).match(RecordedArguments.from([[1, 'a']])))
120+
t.true(RecordedArguments.from([objectWithSelfReference]).match(RecordedArguments.from([anotherObjectWithSelfReference])))
121+
})
122+
123+
test('matches correctly with another RecordedArguments instance when using a wildcard argument', t => {
124+
t.true(RecordedArguments.from([Arg.all()]).match(RecordedArguments.from([1, 2, 3])))
125+
t.true(RecordedArguments.from(['Substitute', 'JS']).match(RecordedArguments.from([Arg.all()])))
126+
})
127+
128+
test('matches correctly with another RecordedArguments instance when using predicate arguments', t => {
129+
t.true(RecordedArguments.from([Arg.any(), Arg.any('number'), Arg.is((x: number) => x === 3), 4]).match(RecordedArguments.from([1, 2, 3, 4])))
130+
t.true(RecordedArguments.from(['Substitute', 'JS']).match(RecordedArguments.from([Arg.is(x => typeof x === 'string'), Arg.any('string')])))
131+
})
132+
133+
test('generates custom text representation', t => {
134+
t.is(inspect(RecordedArguments.none()), '')
135+
t.is(inspect(RecordedArguments.from([])), '()')
136+
t.is(inspect(RecordedArguments.from([undefined])), 'undefined')
137+
t.is(inspect(RecordedArguments.from([undefined, 1])), '(undefined, 1)')
138+
})

spec/Utilities.spec.ts

Lines changed: 3 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,5 @@
1-
import test from 'ava';
1+
import test from 'ava'
22

3-
import { Arg } from '../src';
4-
import { areArgumentArraysEqual } from '../src/Utilities';
5-
6-
const testObject = { "foo": "bar" };
7-
const testArray = ["a", 1, true];
8-
9-
// #90: Infinite recursion in deepEqual https://github.com/ffMathy/FluffySpoon.JavaScript.Testing.Faking/blob/master/spec/issues/90.test.ts
10-
const parent = {} as any;
11-
parent.child = parent;
12-
const root = {} as any;
13-
root.path = { to: { nested: root } };
14-
15-
const testFunc = () => { };
16-
17-
//#region areArgumentArraysEqual
183
test('areArgumentArraysEqual should return valid result for primitive arguments', t => {
19-
// single
20-
t.true(areArgumentArraysEqual([''], ['']));
21-
t.true(areArgumentArraysEqual(['a'], ['a']));
22-
t.true(areArgumentArraysEqual([0], [0]));
23-
t.true(areArgumentArraysEqual([1], [1]));
24-
t.true(areArgumentArraysEqual([true], [true]));
25-
t.true(areArgumentArraysEqual([false], [false]));
26-
t.true(areArgumentArraysEqual([undefined], [undefined]));
27-
t.true(areArgumentArraysEqual([null], [null]));
28-
t.true(areArgumentArraysEqual([testObject], [testObject]));
29-
t.true(areArgumentArraysEqual([testArray], [testArray]));
30-
t.true(areArgumentArraysEqual([testFunc], [testFunc]));
31-
t.true(areArgumentArraysEqual([parent], [parent]));
32-
t.true(areArgumentArraysEqual([root], [root]));
33-
34-
t.false(areArgumentArraysEqual(['a'], ['b']));
35-
t.false(areArgumentArraysEqual([1], [2]));
36-
t.false(areArgumentArraysEqual([true], [false]));
37-
t.false(areArgumentArraysEqual([undefined], [null]));
38-
t.false(areArgumentArraysEqual([testObject], [testArray]));
39-
40-
// multi
41-
t.true(areArgumentArraysEqual([1, 2, 3], [1, 2, 3]));
42-
43-
t.false(areArgumentArraysEqual([1, 2, 3], [3, 2, 1]));
44-
t.false(areArgumentArraysEqual([1, 2, 3, 4], [1, 2, 3]));
45-
t.false(areArgumentArraysEqual([1, 2, 3], [1, 2, 3, 4]));
46-
});
47-
48-
test('areArgumentArraysEqual should return valid result using Arg.all()', t => {
49-
t.true(areArgumentArraysEqual([Arg.all()], []));
50-
t.true(areArgumentArraysEqual([Arg.all()], [0]));
51-
t.true(areArgumentArraysEqual([Arg.all()], [1]));
52-
t.true(areArgumentArraysEqual([Arg.all()], ['string']));
53-
t.true(areArgumentArraysEqual([Arg.all()], [true]));
54-
t.true(areArgumentArraysEqual([Arg.all()], [false]));
55-
t.true(areArgumentArraysEqual([Arg.all()], [null]));
56-
t.true(areArgumentArraysEqual([Arg.all()], [undefined]));
57-
t.true(areArgumentArraysEqual([Arg.all()], [1, 2]));
58-
t.true(areArgumentArraysEqual([Arg.all()], ['string1', 'string2']));
59-
t.true(areArgumentArraysEqual([Arg.all()], [parent, root]));
60-
})
61-
62-
test('areArgumentArraysEqual should return valid result using Arg', t => {
63-
t.true(areArgumentArraysEqual([Arg.any()], ['hi']));
64-
t.true(areArgumentArraysEqual([Arg.any()], [1]));
65-
t.true(areArgumentArraysEqual([Arg.any()], [0]));
66-
t.true(areArgumentArraysEqual([Arg.any()], [false]));
67-
t.true(areArgumentArraysEqual([Arg.any()], [true]));
68-
t.true(areArgumentArraysEqual([Arg.any()], [null]));
69-
t.true(areArgumentArraysEqual([Arg.any()], [undefined]));
70-
t.true(areArgumentArraysEqual([Arg.any()], [testObject]));
71-
t.true(areArgumentArraysEqual([Arg.any()], [testArray]));
72-
t.true(areArgumentArraysEqual([Arg.any()], [testFunc]));
73-
t.true(areArgumentArraysEqual([Arg.any()], []));
74-
t.true(areArgumentArraysEqual([Arg.any()], [parent]));
75-
t.true(areArgumentArraysEqual([Arg.any()], [root]));
76-
77-
t.true(areArgumentArraysEqual([Arg.any('string')], ['foo']));
78-
t.true(areArgumentArraysEqual([Arg.any('number')], [1]));
79-
t.true(areArgumentArraysEqual([Arg.any('boolean')], [true]));
80-
t.true(areArgumentArraysEqual([Arg.any('symbol')], [Symbol()]));
81-
t.true(areArgumentArraysEqual([Arg.any('undefined')], [undefined]));
82-
t.true(areArgumentArraysEqual([Arg.any('object')], [testObject]));
83-
t.true(areArgumentArraysEqual([Arg.any('array')], [testArray]));
84-
t.true(areArgumentArraysEqual([Arg.any('function')], [testFunc]));
85-
t.true(areArgumentArraysEqual([Arg.any('object')], [parent]));
86-
t.true(areArgumentArraysEqual([Arg.any('object')], [root]));
87-
88-
t.false(areArgumentArraysEqual([Arg.any('string')], [1]));
89-
t.false(areArgumentArraysEqual([Arg.any('number')], ['string']));
90-
t.false(areArgumentArraysEqual([Arg.any('boolean')], [null]));
91-
t.false(areArgumentArraysEqual([Arg.any('object')], ['foo']));
92-
t.false(areArgumentArraysEqual([Arg.any('array')], ['bar']));
93-
t.false(areArgumentArraysEqual([Arg.any('function')], ['foo']));
94-
})
95-
96-
test('areArgumentArraysEqual should return valid result using Arg.is()', t => {
97-
t.true(areArgumentArraysEqual([Arg.is(x => x === 'foo')], ['foo']));
98-
t.true(areArgumentArraysEqual([Arg.is(x => x % 2 == 0)], [4]));
99-
100-
t.false(areArgumentArraysEqual([Arg.is(x => x === 'foo')], ['bar']));
101-
t.false(areArgumentArraysEqual([Arg.is(x => x % 2 == 0)], [3]));
102-
});
4+
t.pass()
5+
})

0 commit comments

Comments
 (0)