UNPKG

knxultimate

Version:

KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.

151 lines (126 loc) 4.78 kB
/** * Validates KNX Data Point Type 16 conversions. * * Written in Italy with love, sun and passion, by Massimo Saccani. * * Released under the MIT License. * Use at your own risk; the author assumes no liability for damages. */ import { describe, test } from 'node:test' import assert from 'node:assert/strict' import DPT16 from '../../src/dptlib/dpt16' describe('DPT16 (14-character string)', () => { describe('formatAPDU', () => { test('should correctly format ASCII strings (subtype 000)', () => { const dpt = { ...DPT16, subtypeid: '000' } // Test basic ASCII string const result1 = dpt.formatAPDU('Hello') assert.ok(Buffer.isBuffer(result1)) assert.equal(Buffer.byteLength(result1), 14) const expected1 = Buffer.alloc(14) expected1.write('Hello', 'ascii') assert.deepEqual(result1, expected1) // Test full length ASCII string - gets truncated at 14 chars const result2 = dpt.formatAPDU('Hello World 123') assert.ok(Buffer.isBuffer(result2)) assert.equal(Buffer.byteLength(result2), 14) const expected2 = Buffer.alloc(14) expected2.write('Hello World 123', 'ascii') assert.deepEqual(result2, expected2) // Test empty string const result3 = dpt.formatAPDU('') assert.ok(Buffer.isBuffer(result3)) assert.equal(Buffer.byteLength(result3), 14) assert.deepEqual(result3, Buffer.alloc(14)) }) test('should correctly format ISO-8859-1 strings (subtype 001)', () => { const dpt = { ...DPT16, subtypeid: '001' } // Test string with special characters const result1 = dpt.formatAPDU('Café') assert.ok(Buffer.isBuffer(result1)) assert.equal(Buffer.byteLength(result1), 14) const expected1 = Buffer.alloc(14) expected1.write('Café', 'latin1') assert.deepEqual(result1, expected1) // Test full length string with special characters const result2 = dpt.formatAPDU('Crème Brûlée!!') assert.ok(Buffer.isBuffer(result2)) assert.equal(Buffer.byteLength(result2), 14) const expected2 = Buffer.alloc(14) expected2.write('Crème Brûlée!!', 'latin1') assert.deepEqual(result2, expected2) }) test('should handle non-string inputs', () => { const dpt = { ...DPT16, subtypeid: '000' } // Test number const result1 = dpt.formatAPDU(123 as any) assert.ok(Buffer.isBuffer(result1)) assert.equal(Buffer.byteLength(result1), 14) const expected1 = Buffer.alloc(14) expected1.write('123', 'ascii') assert.deepEqual(result1, expected1) // Test null and undefined const result2 = dpt.formatAPDU(null as any) assert.ok(Buffer.isBuffer(result2)) const expected2 = Buffer.alloc(14) expected2.write('DPT Err', 'ascii') assert.deepEqual(result2, expected2) const result3 = dpt.formatAPDU(undefined as any) assert.ok(Buffer.isBuffer(result3)) const expected3 = Buffer.alloc(14) expected3.write('DPT Err', 'ascii') assert.deepEqual(result3, expected3) }) test('should truncate strings longer than 14 characters', () => { const dpt = { ...DPT16, subtypeid: '000' } const result = dpt.formatAPDU('This is a very long string') assert.ok(Buffer.isBuffer(result)) assert.equal(Buffer.byteLength(result), 14) const expected = Buffer.alloc(14) expected.write('This is a very', 'ascii') assert.deepEqual(result, expected) }) }) describe('fromBuffer', () => { test('should correctly parse ASCII buffers (subtype 000)', () => { const dpt = { ...DPT16, subtypeid: '000' } // Test basic ASCII string const buf1 = Buffer.alloc(14) buf1.write('Hello', 'ascii') assert.equal(dpt.fromBuffer(buf1)?.replace(/\0+$/, ''), 'Hello') // Test full buffer const buf2 = Buffer.alloc(14) buf2.write('Hello World 12', 'ascii') assert.equal( dpt.fromBuffer(buf2)?.replace(/\0+$/, ''), 'Hello World 12', ) }) test('should correctly parse ISO-8859-1 buffers (subtype 001)', () => { const dpt = { ...DPT16, subtypeid: '001' } // Test string with special characters const buf1 = Buffer.alloc(14) buf1.write('Café', 'latin1') assert.equal(dpt.fromBuffer(buf1)?.replace(/\0+$/, ''), 'Café') // Test full buffer with special characters const buf2 = Buffer.alloc(14) buf2.write('Crème Brûlée!!', 'latin1') assert.equal( dpt.fromBuffer(buf2)?.replace(/\0+$/, ''), 'Crème Brûlée!!', ) }) test('should handle invalid buffer lengths', () => { const dpt = { ...DPT16, subtypeid: '000' } // Test short buffer const shortBuf = Buffer.alloc(10) assert.equal(dpt.fromBuffer(shortBuf), null) // Test long buffer const longBuf = Buffer.alloc(20) assert.equal(dpt.fromBuffer(longBuf), null) // Test empty buffer const emptyBuf = Buffer.alloc(0) assert.equal(dpt.fromBuffer(emptyBuf), null) }) }) })