import {expect, test} from 'vitest'; import Component from './component.js'; import Query from './query.js'; const A = new (Component({a: {type: 'int32', defaultValue: 420}})); const B = new (Component({b: {type: 'int32', defaultValue: 69}})); const C = new (Component({c: {type: 'int32'}})); const Types = {A, B, C}; Types.A.createMany([[2], [3]]); Types.B.createMany([[1], [2]]); Types.C.createMany([[2], [4]]); function testQuery(parameters, expected) { const query = new Query(parameters, Types); query.reindex([1, 2, 3]); expect(query.count) .to.equal(expected.length); for (const _ of query.select()) { expect(_.length) .to.equal(parameters.filter((spec) => '!'.charCodeAt(0) !== spec.charCodeAt(0)).length + 1); expect(expected.includes(_.pop())) .to.equal(true); } } test('can query all', () => { testQuery([], [1, 2, 3]); }); test('can query some', () => { testQuery(['A'], [2, 3]); testQuery(['A', 'B'], [2]); }); test('can query excluding', () => { testQuery(['!A'], [1]); testQuery(['A', '!B'], [3]); }); test('can deindex', () => { const query = new Query(['A'], Types); query.reindex([1, 2, 3]); expect(query.count) .to.equal(2); query.deindex([2]); expect(query.count) .to.equal(1); }); test('can reindex', () => { const Test = new (Component({a: {type: 'int32', defaultValue: 420}})); Test.createMany([[2], [3]]); const query = new Query(['Test'], {Test}); query.reindex([2, 3]); expect(query.count) .to.equal(2); Test.destroy(2); query.reindex([2, 3]); expect(query.count) .to.equal(1); }); test('can select', () => { const query = new Query(['A'], Types); query.reindex([1, 2, 3]); const it = query.select(); const result = it.next(); expect(result.value[0].a) .to.equal(420); });