diff options
| author | Terry Truong <terry06890@gmail.com> | 2022-12-18 20:26:07 +1100 |
|---|---|---|
| committer | Terry Truong <terry06890@gmail.com> | 2022-12-18 20:26:07 +1100 |
| commit | fac881d61176f04a4062db710df98924a76b0ffb (patch) | |
| tree | 6c55c0f100668888a31dc54daa24d9d794bdba76 /tests | |
| parent | 83366605d1bd43c245c4c110fadfd1a6fd05d3c2 (diff) | |
Add unit testing
Install vitest, happy-dom, and @testing-library/vue
Add lib.ts and rbtree.ts tests in tests/
Modularise some date-range-managing code from App.vue into lib.ts
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/lib.test.ts | 161 | ||||
| -rw-r--r-- | tests/rbtree.test.ts | 65 |
2 files changed, 226 insertions, 0 deletions
diff --git a/tests/lib.test.ts b/tests/lib.test.ts new file mode 100644 index 0000000..9421ca1 --- /dev/null +++ b/tests/lib.test.ts @@ -0,0 +1,161 @@ +import {moduloPositive, + gregorianToJdn, julianToJdn, jdnToGregorian, jdnToJulian, gregorianToJulian, julianToGregorian, getDaysInMonth, + HistDate, YearDate, CalDate, + queryServer, jsonToHistDate, jsonToHistEvent, + DAY_SCALE, MONTH_SCALE, stepDate, inDateScale, getScaleRatio, getUnitDiff, + DateRangeTree, +} from '/src/lib.ts' + +test('moduloPositive', () => { + expect(moduloPositive(4, 2)).toBe(0) + expect(moduloPositive(5, 3)).toBe(2) + expect(moduloPositive(-5, 3)).toBe(1) +}) + +test('gregorianToJdn', () => { + expect(gregorianToJdn(2010, 11, 3)).toBe(2455504) + expect(gregorianToJdn(-4714, 11, 24)).toBe(0) + expect(gregorianToJdn(-1, 1, 1)).toBe(1721060) +}) +test('julianToJdn', () => { + expect(julianToJdn(2010, 11, 3)).toBe(2455517) + expect(julianToJdn(-4713, 1, 1)).toBe(0) + expect(julianToJdn(-1, 1, 1)).toBe(1721058) +}) +test('jdnToGregorian', () => { + expect(jdnToGregorian(2455504)).toEqual([2010, 11, 3]) + expect(jdnToGregorian(0)).toEqual([-4714, 11, 24]) + expect(jdnToGregorian(1721060)).toEqual([-1, 1, 1]) +}) +test('jdnToJulian', () => { + expect(jdnToJulian(2455517)).toEqual([2010, 11, 3]) + expect(jdnToJulian(0)).toEqual([-4713, 1, 1]) + expect(jdnToJulian(1721058)).toEqual([-1, 1, 1]) +}) +test('gregorianToJulian', () => { + expect(gregorianToJulian(2022, 9, 30)).toEqual([2022, 9, 17]) + expect(gregorianToJulian(1616, 5, 3)).toEqual([1616, 4, 23]) +}) +test('julianToGregorian', () => { + expect(julianToGregorian(2022, 9, 17)).toEqual([2022, 9, 30]) + expect(julianToGregorian(1616, 4, 23)).toEqual([1616, 5, 3]) +}) +test('getDaysInMonth', () => { + expect(getDaysInMonth(2022, 12)).toBe(31) + expect(getDaysInMonth(2022, 2)).toBe(28) + expect(getDaysInMonth(2000, 2)).toBe(29) +}) + +describe('YearDate', () => { + test('constructor', () => { + expect(() => new YearDate(2000)).toThrowError() + expect(() => new YearDate(-5000)).not.toThrowError() + }) + test('cmp', () => { + expect((new YearDate(-5000)).equals(new YearDate(-5000))).toBe(true) + expect((new YearDate(-6000)).equals(new YearDate(-5999))).toBe(false) + expect((new YearDate(-6000)).isEarlier(new YearDate(-5000))).toBe(true) + expect((new YearDate(-5000)).cmp(new YearDate(-6000))).toBe(1) + }) + test('diff', () => { + expect((new YearDate(-5000)).getMonthDiff(new YearDate(-5001))).toBe(12) + expect((new YearDate(-5000)).getYearDiff(new YearDate(-6000))).toBe(1000) + }) +}) +describe('CalDate', () => { + test('cmp', () => { + expect((new CalDate(2000, 1, 1)).equals(new CalDate(2000, 1, 1))).toBe(true) + expect((new CalDate(2000, 1, 1)).equals(new CalDate(-1, 1, 1))).toBe(false) + expect((new CalDate(-1, 1, 1)).isEarlier(new CalDate(1, 1, 1))).toBe(true) + expect((new CalDate(1, 11, 1)).cmp(new CalDate(2, 1, 11))).toBe(-1) + expect((new CalDate(100, 12, 1)).cmp(new CalDate(100, 11, 30))).toBe(1) + expect((new CalDate(10, 3, 10)).cmp(new CalDate(10, 3, 20))).toBe(-1) + }) + test('diff', () => { + expect((new CalDate(2000, 1, 1)).getDayDiff(new CalDate(2001, 1, 1))).toBe(366) + expect((new CalDate(100, 11, 30)).getMonthDiff(new CalDate(101, 4, 1))).toBe(5) + expect((new CalDate(-1, 10, 3)).getYearDiff(new CalDate(1, 1, 1))).toBe(1) + }) +}) + +test('queryServer', async () => { + let oldFetch = fetch + fetch = vi.fn(() => ({json: () => ({test: 'value'})})) + let json = await queryServer('', 'http://example.com/') + expect(json).toEqual({test: 'value'}) + fetch = oldFetch +}) +test('jsonToHistDate', () => { + expect(jsonToHistDate({gcal: true, year: 1000, month: 1, day: 10})).toEqual(new CalDate(1000, 1, 10)) + expect(jsonToHistDate({gcal: null, year: -5000, month: 1, day: 1})).toEqual(new YearDate(-5000)) +}) +test('jsonToHistEvent', () => { + let jsonEvent = { + id: 3, + title: 'abc', + start: {gcal: true, year: 2000, month: 10, day: 5}, + startUper: null, + end: {gcal: true, year: 2010, month: 1, day: 1}, + endUpper: null, + ctg: 'event', + imgId: 100, + pop: 301, + } + expect(jsonToHistEvent(jsonEvent)).toEqual({ + id: 3, + title: 'abc', + start: new CalDate(2000, 10, 5), + startUpper: null, + end: new CalDate(2010, 1, 1), + endUpper: null, + ctg: 'event', + imgId: 100, + pop: 301, + }); +}) + +test('stepDate', () => { + expect(stepDate(new CalDate(2000, 1, 1), DAY_SCALE)).toEqual(new CalDate(2000, 1, 2)) + expect(stepDate(new CalDate(2000, 1, 2), DAY_SCALE, {forward: false, count: 10})).toEqual(new CalDate(1999, 12, 23)) + expect(stepDate(new CalDate(2000, 10, 11), MONTH_SCALE, {count: 5})).toEqual(new CalDate(2001, 3, 11)) + expect(stepDate(new CalDate(2000, 1, 3), 1, {count: 10})).toEqual(new CalDate(2010, 1, 3)) + expect(stepDate(new YearDate(-5000), 1e3, {forward: false, count: 6})).toEqual(new YearDate(-11000)) +}) +test('inDateScale', () => { + expect(inDateScale(new CalDate(100, 2, 3), DAY_SCALE)).toBe(true) + expect(inDateScale(new CalDate(100, 2, 3), MONTH_SCALE)).toBe(false) + expect(inDateScale(new CalDate(100, 2, 1), MONTH_SCALE)).toBe(true) + expect(inDateScale(new CalDate(100, 2, 1), 1)).toBe(false) + expect(inDateScale(new CalDate(100, 1, 1), 1)).toBe(true) + expect(inDateScale(new YearDate(-5000), 1e3)).toBe(true) + expect(inDateScale(new YearDate(-5100), 1e3)).toBe(false) +}) +test('getScaleRatio', () => { + expect(getScaleRatio(DAY_SCALE, MONTH_SCALE)).toBe(31) + expect(getScaleRatio(MONTH_SCALE, 1)).toBe(12) + expect(getScaleRatio(MONTH_SCALE, 10)).toBe(120) + expect(getScaleRatio(200, 10)).toBeCloseTo(1/20, 5) +}) +test('getUnitDiff', () => { + expect(getUnitDiff(new CalDate(2000, 1, 1), (new CalDate(2000, 2, 2)), DAY_SCALE)).toBe(32) + expect(getUnitDiff(new CalDate(2000, 10, 10), (new CalDate(2001, 11, 2)), MONTH_SCALE)).toBe(13) + expect(getUnitDiff(new CalDate(-1, 1, 10), (new CalDate(10, 11, 2)), 1)).toBe(10) + expect(getUnitDiff(new YearDate(-5000), (new YearDate(-6500)), 10)).toBe(150) +}) + +test('DateRangeTree', () => { + let ranges = new DateRangeTree() + ranges.add([new CalDate(100, 1, 1), new CalDate(200, 1, 1)]) + ranges.add([new CalDate(300, 1, 1), new CalDate(400, 1, 1)]) + expect(ranges.tree.size).toBe(2) + expect(ranges.has([new CalDate(300, 1, 1), new CalDate(400, 1, 1)])).toBe(true) + ranges.add([new CalDate(-100, 1, 1), new CalDate(150, 1, 1)]) + ranges.add([new CalDate(400, 1, 1), new CalDate(500, 1, 1)]) + expect(ranges.tree.size).toBe(2) + expect(ranges.has([new CalDate(-100, 1, 1), new CalDate(200, 1, 1)])).toBe(true) + expect(ranges.has([new CalDate(300, 1, 1), new CalDate(500, 1, 1)])).toBe(true) + ranges.add([new CalDate(-1000, 1, 1), new CalDate(310, 10, 2)]) + expect(ranges.tree.size).toBe(1) + expect(ranges.has([new CalDate(-1000, 1, 1), new CalDate(500, 1, 1)])).toBe(true) + expect(ranges.has([new CalDate(-1, 1, 1), new CalDate(1, 1, 1)])).toBe(true) +}) diff --git a/tests/rbtree.test.ts b/tests/rbtree.test.ts new file mode 100644 index 0000000..5b2bc34 --- /dev/null +++ b/tests/rbtree.test.ts @@ -0,0 +1,65 @@ +import {RBTree, Iterator, rbtree_shallow_copy} from '/src/rbtree.ts' + +function cmpInt(a: int, b: int){ + return a - b; +} +function getIteratorEls<T>(itr: Iterator<T>): T[]{ + let els: T[] = []; + if (itr.data() != null){ + els.push(itr.data()); + } + let el: T | null; + while ((el = itr.next()) != null){ + els.push(el); + } + return els; +} +function getIteratorElsRev<T>(itr: Iterator<T>): T[]{ + let els: T[] = []; + if (itr.data() != null){ + els.push(itr.data()); + } + let el: T | null; + while ((el = itr.prev()) != null){ + els.push(el); + } + return els; +} + +test('insert and remove', () => { + let tree = new RBTree(cmpInt); + expect(tree.insert(10)).toBe(true); + expect(tree.insert(10)).toBe(false); + expect(tree.insert(20)).toBe(true); + expect(tree.insert(-1)).toBe(true); + // + expect(tree.remove(100)).toBe(false); + expect(tree.remove(10)).toBe(true); + // + expect(tree.size).toBe(2); + expect(tree.min()).toBe(-1); + expect(tree.max()).toBe(20); +}); +test('iteration', () => { + let vals = [10, 10, 20, 5, -1]; + let tree = new RBTree(cmpInt); + for (let v of vals){ + tree.insert(v); + } + let sorted = Array.from(new Set(vals)).sort(cmpInt); + expect(getIteratorEls(tree.iterator())).toEqual(sorted); + sorted.reverse() + expect(getIteratorElsRev(tree.iterator())).toEqual(sorted); +}); +test('find', () => { + let tree = new RBTree(cmpInt); + tree.insert(1); + tree.insert(10); + tree.insert(50); + tree.insert(100); + // + expect(tree.find(40)).toBe(null); + expect(tree.find(50)).toBe(50); + expect(getIteratorEls(tree.lowerBound(10))).toEqual([10, 50, 100]); + expect(getIteratorEls(tree.upperBound(10))).toEqual([50, 100]); +}); |
