Source code
Revision control
Copy as Markdown
Other Tools
export const description = `
Tests for TestQuery
`;
import { makeTestGroup } from '../common/framework/test_group.js';
import { parseQuery } from '../common/internal/query/parseQuery.js';
import {
TestQueryMultiFile,
TestQueryMultiTest,
TestQueryMultiCase,
TestQuerySingleCase,
TestQuery,
} from '../common/internal/query/query.js';
import { UnitTest } from './unit_test.js';
class F extends UnitTest {
expectToString(q: TestQuery, exp: string) {
this.expect(q.toString() === exp);
}
expectQueriesEqual(q1: TestQuery, q2: TestQuery) {
this.expect(q1.level === q2.level);
if (q1.level >= 1) {
this.expect(q1.isMultiFile === q2.isMultiFile);
this.expect(q1.suite === q2.suite);
this.expect(q1.filePathParts.length === q2.filePathParts.length);
for (let i = 0; i < q1.filePathParts.length; i++) {
this.expect(q1.filePathParts[i] === q2.filePathParts[i]);
}
}
if (q1.level >= 2) {
const p1 = q1 as TestQueryMultiTest;
const p2 = q2 as TestQueryMultiTest;
this.expect(p1.isMultiTest === p2.isMultiTest);
this.expect(p1.testPathParts.length === p2.testPathParts.length);
for (let i = 0; i < p1.testPathParts.length; i++) {
this.expect(p1.testPathParts[i] === p2.testPathParts[i]);
}
}
if (q1.level >= 3) {
const p1 = q1 as TestQueryMultiCase;
const p2 = q2 as TestQueryMultiCase;
this.expect(p1.isMultiCase === p2.isMultiCase);
this.expect(Object.keys(p1.params).length === Object.keys(p2.params).length);
for (const key of Object.keys(p1.params)) {
this.expect(key in p2.params);
const v1 = p1.params[key];
const v2 = p2.params[key];
this.expect(
v1 === v2 ||
(typeof v1 === 'number' && isNaN(v1)) === (typeof v2 === 'number' && isNaN(v2))
);
this.expect(Object.is(v1, -0) === Object.is(v2, -0));
}
}
}
expectQueryParse(s: string, q: TestQuery) {
this.expectQueriesEqual(q, parseQuery(s));
}
}
export const g = makeTestGroup(F);
g.test('constructor').fn(t => {
t.shouldThrow('Error', () => new TestQueryMultiTest('suite', [], []));
t.shouldThrow('Error', () => new TestQueryMultiCase('suite', ['a'], [], {}));
t.shouldThrow('Error', () => new TestQueryMultiCase('suite', [], ['c'], {}));
t.shouldThrow('Error', () => new TestQueryMultiCase('suite', [], [], {}));
t.shouldThrow('Error', () => new TestQuerySingleCase('suite', ['a'], [], {}));
t.shouldThrow('Error', () => new TestQuerySingleCase('suite', [], ['c'], {}));
t.shouldThrow('Error', () => new TestQuerySingleCase('suite', [], [], {}));
});
g.test('toString').fn(t => {
t.expectToString(new TestQueryMultiFile('s', []), 's:*');
t.expectToString(new TestQueryMultiFile('s', ['a']), 's:a,*');
t.expectToString(new TestQueryMultiFile('s', ['a', 'b']), 's:a,b,*');
t.expectToString(new TestQueryMultiTest('s', ['a', 'b'], []), 's:a,b:*');
t.expectToString(new TestQueryMultiTest('s', ['a', 'b'], ['c']), 's:a,b:c,*');
t.expectToString(new TestQueryMultiTest('s', ['a', 'b'], ['c', 'd']), 's:a,b:c,d,*');
t.expectToString(new TestQueryMultiCase('s', ['a', 'b'], ['c', 'd'], {}), 's:a,b:c,d:*');
t.expectToString(
new TestQueryMultiCase('s', ['a', 'b'], ['c', 'd'], { x: 1 }),
's:a,b:c,d:x=1;*'
);
t.expectToString(
new TestQueryMultiCase('s', ['a', 'b'], ['c', 'd'], { x: 1, y: 2 }),
's:a,b:c,d:x=1;y=2;*'
);
t.expectToString(
new TestQuerySingleCase('s', ['a', 'b'], ['c', 'd'], { x: 1, y: 2 }),
's:a,b:c,d:x=1;y=2'
);
t.expectToString(new TestQuerySingleCase('s', ['a', 'b'], ['c', 'd'], {}), 's:a,b:c,d:');
// Test handling of magic param value that convert to NaN/undefined/Infinity/etc.
t.expectToString(new TestQuerySingleCase('s', ['a'], ['b'], { c: NaN }), 's:a:b:c="_nan_"');
t.expectToString(
new TestQuerySingleCase('s', ['a'], ['b'], { c: undefined }),
's:a:b:c="_undef_"'
);
t.expectToString(new TestQuerySingleCase('s', ['a'], ['b'], { c: -0 }), 's:a:b:c="_negzero_"');
});
g.test('parseQuery').fn(t => {
t.expectQueryParse('s:*', new TestQueryMultiFile('s', []));
t.expectQueryParse('s:a,*', new TestQueryMultiFile('s', ['a']));
t.expectQueryParse('s:a,b,*', new TestQueryMultiFile('s', ['a', 'b']));
t.expectQueryParse('s:a,b:*', new TestQueryMultiTest('s', ['a', 'b'], []));
t.expectQueryParse('s:a,b:c,*', new TestQueryMultiTest('s', ['a', 'b'], ['c']));
t.expectQueryParse('s:a,b:c,d,*', new TestQueryMultiTest('s', ['a', 'b'], ['c', 'd']));
t.expectQueryParse('s:a,b:c,d:*', new TestQueryMultiCase('s', ['a', 'b'], ['c', 'd'], {}));
t.expectQueryParse(
's:a,b:c,d:x=1;*',
new TestQueryMultiCase('s', ['a', 'b'], ['c', 'd'], { x: 1 })
);
t.expectQueryParse(
's:a,b:c,d:x=1;y=2;*',
new TestQueryMultiCase('s', ['a', 'b'], ['c', 'd'], { x: 1, y: 2 })
);
t.expectQueryParse(
's:a,b:c,d:x=1;y=2',
new TestQuerySingleCase('s', ['a', 'b'], ['c', 'd'], { x: 1, y: 2 })
);
t.expectQueryParse('s:a,b:c,d:', new TestQuerySingleCase('s', ['a', 'b'], ['c', 'd'], {}));
// Test handling of magic param value that convert to NaN/undefined/Infinity/etc.
t.expectQueryParse('s:a:b:c="_nan_"', new TestQuerySingleCase('s', ['a'], ['b'], { c: NaN }));
t.expectQueryParse(
's:a:b:c="_undef_"',
new TestQuerySingleCase('s', ['a'], ['b'], { c: undefined })
);
t.expectQueryParse('s:a:b:c="_negzero_"', new TestQuerySingleCase('s', ['a'], ['b'], { c: -0 }));
});