test: 16 tests for typed compliance comparison (numeric, boolean, string)

This commit is contained in:
Kevin L'Hereec committed 2026-06-03 08:56:12 +02:00
1 parent 478439783d
commit 3fefbf6c40
1 file changed
+111
@@ -0,0 +1,111 @@
import { describe, it, expect } from 'vitest'
/**
* Tests for the typed compliance comparison logic used in configuration_engine.ts
* Extracted here for clarity — the logic is:
* - numeric types (int, unsignedInt): compare as Number, fallback to String if NaN
* - boolean types: compare true/false/'true'/'false'/'1'/'0'
* - everything else: compare as String
*/
function compareValues(
currentValue: any,
desiredValue: any,
desiredType: string
): boolean {
const isNumeric =
desiredType === 'unsignedInt' ||
desiredType === 'int' ||
desiredType === 'xsd:unsignedInt' ||
desiredType === 'xsd:int'
const isBool = desiredType === 'boolean' || desiredType === 'xsd:boolean'
if (isNumeric) {
const numCurrent = Number(currentValue)
const numDesired = Number(desiredValue)
return !isNaN(numCurrent) && !isNaN(numDesired)
? numCurrent === numDesired
: String(currentValue) === String(desiredValue)
} else if (isBool) {
const toBool = (v: any) => v === true || v === 'true' || v === '1'
return toBool(currentValue) === toBool(desiredValue)
} else {
return String(currentValue) === String(desiredValue)
}
}
describe('Compliance value comparison', () => {
describe('numeric types (unsignedInt, int)', () => {
it('60 (number) equals "60" (string)', () => {
expect(compareValues(60, '60', 'unsignedInt')).toBe(true)
})
it('"30" equals 30', () => {
expect(compareValues('30', 30, 'xsd:unsignedInt')).toBe(true)
})
it('0 equals "0"', () => {
expect(compareValues(0, '0', 'int')).toBe(true)
})
it('60 does not equal "90"', () => {
expect(compareValues(60, '90', 'unsignedInt')).toBe(false)
})
it('NaN values fallback to string comparison', () => {
expect(compareValues('abc', 'abc', 'xsd:int')).toBe(true)
expect(compareValues('abc', 'def', 'xsd:int')).toBe(false)
})
})
describe('boolean types', () => {
it('true equals "true"', () => {
expect(compareValues(true, 'true', 'xsd:boolean')).toBe(true)
})
it('"1" equals true', () => {
expect(compareValues('1', true, 'boolean')).toBe(true)
})
it('false equals "false"', () => {
expect(compareValues(false, 'false', 'xsd:boolean')).toBe(true)
})
it('"0" equals false', () => {
expect(compareValues('0', false, 'boolean')).toBe(true)
})
it('true does not equal false', () => {
expect(compareValues(true, false, 'xsd:boolean')).toBe(false)
})
it('"1" does not equal "0"', () => {
expect(compareValues('1', '0', 'boolean')).toBe(false)
})
})
describe('string types (default)', () => {
it('same strings match', () => {
expect(compareValues('hello', 'hello', 'xsd:string')).toBe(true)
})
it('different strings do not match', () => {
expect(compareValues('hello', 'world', 'string')).toBe(false)
})
it('number is converted to string for comparison', () => {
expect(compareValues(42, '42', 'xsd:string')).toBe(true)
})
it('null is converted to "null"', () => {
expect(compareValues(null, 'null', 'xsd:string')).toBe(true)
})
})
describe('unknown/empty type defaults to string', () => {
it('empty type uses string comparison', () => {
expect(compareValues('60', '60', '')).toBe(true)
expect(compareValues(60, '60', '')).toBe(true)
})
})
})