copied set implementations from MultiFlag JS

This commit is contained in:
2026-02-09 22:11:23 +01:00
parent 80c17ac3ac
commit 140896bd7c
56 changed files with 8055 additions and 24 deletions

View File

@@ -0,0 +1,62 @@
import { ArrayFlagSet } from '~'
describe(ArrayFlagSet, () => {
test('none', () => {
const flags = new ArrayFlagSet<string>()
expect(flags.none()).toEqual([])
})
test('union', () => {
const flags = new ArrayFlagSet<string>()
expect(flags.union([], [])).toEqual([])
expect(flags.union(['A'], [])).toEqual(['A'])
expect(flags.union([], ['B'])).toEqual(['B'])
expect(flags.union(['A'], ['B'])).toEqual(['A', 'B'])
expect(flags.union(['A', 'B'], ['B', 'C'])).toEqual(['A', 'B', 'C'])
})
test('difference', () => {
const flags = new ArrayFlagSet<string>()
expect(flags.difference([], [])).toEqual([])
expect(flags.difference(['A'], [])).toEqual(['A'])
expect(flags.difference(['A', 'B'], ['B', 'C'])).toEqual(['A'])
expect(flags.difference(['B', 'C'], ['A', 'B'])).toEqual(['C'])
expect(flags.difference(['D'], ['A', 'E'])).toEqual(['D'])
})
test('intersection', () => {
const flags = new ArrayFlagSet<string>()
expect(flags.intersection([], [])).toEqual([])
expect(flags.intersection(['A'], [])).toEqual([])
expect(flags.intersection(['A'], ['B'])).toEqual([])
expect(flags.intersection(['A'], ['A', 'B'])).toEqual(['A'])
expect(flags.intersection(['A', 'B', 'D'], ['A', 'C'])).toEqual(['A'])
expect(flags.intersection(['A', 'B', 'D'], ['A', 'B', 'C'])).toEqual([
'A',
'B',
])
})
test('isSuperset', () => {
const flags = new ArrayFlagSet<string>()
expect(flags.isSuperset([], [])).toBe(true)
expect(flags.isSuperset(['A', 'B'], [])).toBe(true)
expect(flags.isSuperset(['A', 'B'], ['A'])).toBe(true)
expect(flags.isSuperset(['A', 'B'], ['A', 'B'])).toBe(true)
expect(flags.isSuperset([], ['A', 'B'])).toBe(false)
expect(flags.isSuperset(['C', 'D'], ['B'])).toBe(false)
})
test('enumerate', () => {
const flags = new ArrayFlagSet<string>()
expect([...flags.enumerate([])]).toEqual([])
expect([...flags.enumerate(['A'])]).toEqual(['A'])
expect([...flags.enumerate(['A', 'B', 'C'])]).toEqual(['A', 'B', 'C'])
})
})

View File

@@ -0,0 +1,66 @@
import { Base64BitFlagSet } from '~'
describe(Base64BitFlagSet, () => {
test('none', () => {
const flags = new Base64BitFlagSet()
expect(flags.none()).toEqual('')
})
test('union', () => {
const flags = new Base64BitFlagSet()
expect(flags.union('', '')).toEqual('')
expect(flags.union('A', 'A')).toEqual('')
expect(flags.union('B', 'A')).toEqual('B')
expect(flags.union('A', 'C')).toEqual('C')
expect(flags.union('B', 'C')).toEqual('D')
expect(flags.union('D', 'G')).toEqual('H')
})
test('difference', () => {
const flags = new Base64BitFlagSet()
expect(flags.difference('', '')).toEqual('')
expect(flags.difference('A', 'A')).toEqual('')
expect(flags.difference('B', 'A')).toEqual('B')
expect(flags.difference('D', 'G')).toEqual('B')
expect(flags.difference('G', 'D')).toEqual('E')
expect(flags.difference('IB', 'R')).toEqual('IB')
})
test('intersection', () => {
const flags = new Base64BitFlagSet()
expect(flags.intersection('', '')).toEqual('')
expect(flags.intersection('A', 'A')).toEqual('')
expect(flags.intersection('B', 'A')).toEqual('')
expect(flags.intersection('B', 'C')).toEqual('')
expect(flags.intersection('B', 'D')).toEqual('B')
expect(flags.intersection('L', 'F')).toEqual('B')
expect(flags.intersection('L', 'H')).toEqual('D')
})
test('isSuperset', () => {
const flags = new Base64BitFlagSet()
expect(flags.isSuperset('A', 'A')).toBe(true)
expect(flags.isSuperset('D', 'A')).toBe(true)
expect(flags.isSuperset('D', 'B')).toBe(true)
expect(flags.isSuperset('D', 'D')).toBe(true)
expect(flags.isSuperset('A', 'D')).toBe(false)
expect(flags.isSuperset('I', 'E')).toBe(false)
})
test('enumerate', () => {
const flags = new Base64BitFlagSet()
expect([...flags.enumerate('A')]).toEqual([])
expect([...flags.enumerate('B')]).toEqual([1])
expect([...flags.enumerate('C')]).toEqual([2])
expect([...flags.enumerate('D')]).toEqual([1, 2])
expect([...flags.enumerate('L')]).toEqual([1, 2, 4])
expect([...flags.enumerate('kB')]).toEqual([3, 6, 7])
expect([...flags.enumerate('AAB')]).toEqual([13])
})
})

View File

@@ -0,0 +1,62 @@
import { BigBitFlagSet } from '~'
describe(BigBitFlagSet, () => {
test('none', () => {
const flags = new BigBitFlagSet()
expect(flags.none()).toEqual(0n)
})
test('union', () => {
const flags = new BigBitFlagSet()
expect(flags.union(0n, 0n)).toEqual(0n)
expect(flags.union(1n, 0n)).toEqual(1n)
expect(flags.union(0n, 2n)).toEqual(2n)
expect(flags.union(1n, 2n)).toEqual(3n)
expect(flags.union(3n, 6n)).toEqual(7n)
})
test('difference', () => {
const flags = new BigBitFlagSet()
expect(flags.difference(0n, 0n)).toEqual(0n)
expect(flags.difference(1n, 0n)).toEqual(1n)
expect(flags.difference(3n, 6n)).toEqual(1n)
expect(flags.difference(6n, 3n)).toEqual(4n)
expect(flags.difference(8n, 17n)).toEqual(8n)
})
test('intersection', () => {
const flags = new BigBitFlagSet()
expect(flags.intersection(0n, 0n)).toEqual(0n)
expect(flags.intersection(1n, 0n)).toEqual(0n)
expect(flags.intersection(1n, 2n)).toEqual(0n)
expect(flags.intersection(1n, 3n)).toEqual(1n)
expect(flags.intersection(11n, 5n)).toEqual(1n)
expect(flags.intersection(11n, 7n)).toEqual(3n)
})
test('isSuperset', () => {
const flags = new BigBitFlagSet()
expect(flags.isSuperset(0n, 0n)).toBe(true)
expect(flags.isSuperset(3n, 0n)).toBe(true)
expect(flags.isSuperset(3n, 1n)).toBe(true)
expect(flags.isSuperset(3n, 3n)).toBe(true)
expect(flags.isSuperset(0n, 3n)).toBe(false)
expect(flags.isSuperset(8n, 4n)).toBe(false)
})
test('enumerate', () => {
const flags = new BigBitFlagSet()
expect([...flags.enumerate(0n)]).toEqual([])
expect([...flags.enumerate(1n)]).toEqual([1n])
expect([...flags.enumerate(2n)]).toEqual([2n])
expect([...flags.enumerate(3n)]).toEqual([1n, 2n])
expect([...flags.enumerate(11n)]).toEqual([1n, 2n, 8n])
expect([...flags.enumerate(100n)]).toEqual([4n, 32n, 64n])
})
})

View File

@@ -0,0 +1,73 @@
import { CollectionFlagSet } from '~'
function set<T>(...values: T[]): Set<T> {
return new Set<T>(values)
}
describe(CollectionFlagSet, () => {
test('none', () => {
const flags = new CollectionFlagSet<string>()
expect(flags.none()).toEqual(set())
})
test('union', () => {
const flags = new CollectionFlagSet<string>()
expect(flags.union(set(), set())).toEqual(set())
expect(flags.union(set('A'), set())).toEqual(set('A'))
expect(flags.union(set(), set('B'))).toEqual(set('B'))
expect(flags.union(set('A'), set('B'))).toEqual(set('A', 'B'))
expect(flags.union(set('A', 'B'), set('B', 'C'))).toEqual(
set('A', 'B', 'C')
)
})
test('difference', () => {
const flags = new CollectionFlagSet<string>()
expect(flags.difference(set(), set())).toEqual(set())
expect(flags.difference(set('A'), set())).toEqual(set('A'))
expect(flags.difference(set('A', 'B'), set('B', 'C'))).toEqual(set('A'))
expect(flags.difference(set('B', 'C'), set('A', 'B'))).toEqual(set('C'))
expect(flags.difference(set('D'), set('A', 'E'))).toEqual(set('D'))
})
test('intersection', () => {
const flags = new CollectionFlagSet<string>()
expect(flags.intersection(set(), set())).toEqual(set())
expect(flags.intersection(set('A'), set())).toEqual(set())
expect(flags.intersection(set('A'), set('B'))).toEqual(set())
expect(flags.intersection(set('A'), set('A', 'B'))).toEqual(set('A'))
expect(flags.intersection(set('A', 'B', 'D'), set('A', 'C'))).toEqual(
set('A')
)
expect(
flags.intersection(set('A', 'B', 'D'), set('A', 'B', 'C'))
).toEqual(set('A', 'B'))
})
test('isSuperset', () => {
const flags = new CollectionFlagSet<string>()
expect(flags.isSuperset(set(), set())).toBe(true)
expect(flags.isSuperset(set('A', 'B'), set())).toBe(true)
expect(flags.isSuperset(set('A', 'B'), set('A'))).toBe(true)
expect(flags.isSuperset(set('A', 'B'), set('A', 'B'))).toBe(true)
expect(flags.isSuperset(set(), set('A', 'B'))).toBe(false)
expect(flags.isSuperset(set('C', 'D'), set('B'))).toBe(false)
})
test('enumerate', () => {
const flags = new CollectionFlagSet<string>()
expect([...flags.enumerate(set())]).toEqual([])
expect([...flags.enumerate(set('A'))]).toEqual(['A'])
expect([...flags.enumerate(set('A', 'B', 'C'))]).toEqual([
'A',
'B',
'C',
])
})
})

View File

@@ -0,0 +1,62 @@
import { BitFlagSet } from '~'
describe(BitFlagSet, () => {
test('none', () => {
const flags = new BitFlagSet()
expect(flags.none()).toEqual(0)
})
test('union', () => {
const flags = new BitFlagSet()
expect(flags.union(0, 0)).toEqual(0)
expect(flags.union(1, 0)).toEqual(1)
expect(flags.union(0, 2)).toEqual(2)
expect(flags.union(1, 2)).toEqual(3)
expect(flags.union(3, 6)).toEqual(7)
})
test('difference', () => {
const flags = new BitFlagSet()
expect(flags.difference(0, 0)).toEqual(0)
expect(flags.difference(1, 0)).toEqual(1)
expect(flags.difference(3, 6)).toEqual(1)
expect(flags.difference(6, 3)).toEqual(4)
expect(flags.difference(8, 17)).toEqual(8)
})
test('intersection', () => {
const flags = new BitFlagSet()
expect(flags.intersection(0, 0)).toEqual(0)
expect(flags.intersection(1, 0)).toEqual(0)
expect(flags.intersection(1, 2)).toEqual(0)
expect(flags.intersection(1, 3)).toEqual(1)
expect(flags.intersection(11, 5)).toEqual(1)
expect(flags.intersection(11, 7)).toEqual(3)
})
test('isSuperset', () => {
const flags = new BitFlagSet()
expect(flags.isSuperset(0, 0)).toBe(true)
expect(flags.isSuperset(3, 0)).toBe(true)
expect(flags.isSuperset(3, 1)).toBe(true)
expect(flags.isSuperset(3, 3)).toBe(true)
expect(flags.isSuperset(0, 3)).toBe(false)
expect(flags.isSuperset(8, 4)).toBe(false)
})
test('enumerate', () => {
const flags = new BitFlagSet()
expect([...flags.enumerate(0)]).toEqual([])
expect([...flags.enumerate(1)]).toEqual([1])
expect([...flags.enumerate(2)]).toEqual([2])
expect([...flags.enumerate(3)]).toEqual([1, 2])
expect([...flags.enumerate(11)]).toEqual([1, 2, 8])
expect([...flags.enumerate(100)]).toEqual([4, 32, 64])
})
})