221 lines
5.5 KiB
JavaScript
221 lines
5.5 KiB
JavaScript
const test = require('tap').test
|
||
const Mode = require('core/mode')
|
||
const Segments = require('core/segments')
|
||
const NumericData = require('core/numeric-data')
|
||
const AlphanumericData = require('core/alphanumeric-data')
|
||
const ByteData = require('core/byte-data')
|
||
const toSJIS = require('helper/to-sjis')
|
||
const Utils = require('core/utils')
|
||
|
||
let testData = [
|
||
{
|
||
input: '1A1',
|
||
result: [{ data: '1A1', mode: Mode.ALPHANUMERIC }]
|
||
},
|
||
{
|
||
input: 'a-1-b-2?',
|
||
result: [{ data: 'a-1-b-2?', mode: Mode.BYTE }]
|
||
},
|
||
{
|
||
input: 'AB123456CDF',
|
||
result: [{ data: 'AB123456CDF', mode: Mode.ALPHANUMERIC }]
|
||
},
|
||
{
|
||
input: 'aABC000000-?-----a',
|
||
result: [
|
||
{ data: 'aABC', mode: Mode.BYTE },
|
||
{ data: '000000', mode: Mode.NUMERIC },
|
||
{ data: '-?-----a', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: 'aABC000000A?',
|
||
result: [
|
||
{ data: 'aABC', mode: Mode.BYTE },
|
||
{ data: '000000', mode: Mode.NUMERIC },
|
||
{ data: 'A?', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: 'a1234ABCDEF?',
|
||
result: [
|
||
{ data: 'a', mode: Mode.BYTE },
|
||
{ data: '1234ABCDEF', mode: Mode.ALPHANUMERIC },
|
||
{ data: '?', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: '12345A12345',
|
||
result: [
|
||
{ data: '12345A12345', mode: Mode.ALPHANUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: 'aABCDEFGHILMNa',
|
||
result: [
|
||
{ data: 'a', mode: Mode.BYTE },
|
||
{ data: 'ABCDEFGHILMN', mode: Mode.ALPHANUMERIC },
|
||
{ data: 'a', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: 'Aa12345',
|
||
result: [
|
||
{ data: 'Aa', mode: Mode.BYTE },
|
||
{ data: '12345', mode: Mode.NUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: 'a1A2B3C4D5E6F4G7',
|
||
result: [
|
||
{ data: 'a', mode: Mode.BYTE },
|
||
{ data: '1A2B3C4D5E6F4G7', mode: Mode.ALPHANUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: '123456789QWERTYUIOPASD',
|
||
result: [
|
||
{ data: '123456789', mode: Mode.NUMERIC },
|
||
{ data: 'QWERTYUIOPASD', mode: Mode.ALPHANUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: 'QWERTYUIOPASD123456789',
|
||
result: [
|
||
{ data: 'QWERTYUIOPASD', mode: Mode.ALPHANUMERIC },
|
||
{ data: '123456789', mode: Mode.NUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: 'ABCDEF123456a',
|
||
result: [
|
||
{ data: 'ABCDEF123456', mode: Mode.ALPHANUMERIC },
|
||
{ data: 'a', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: 'abcdefABCDEF',
|
||
result: [
|
||
{ data: 'abcdef', mode: Mode.BYTE },
|
||
{ data: 'ABCDEF', mode: Mode.ALPHANUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: 'a123456ABCDEa',
|
||
result: [
|
||
{ data: 'a', mode: Mode.BYTE },
|
||
{ data: '123456ABCDE', mode: Mode.ALPHANUMERIC },
|
||
{ data: 'a', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: 'AAAAA12345678?A1A',
|
||
result: [
|
||
{ data: 'AAAAA', mode: Mode.ALPHANUMERIC },
|
||
{ data: '12345678', mode: Mode.NUMERIC },
|
||
{ data: '?A1A', mode: Mode.BYTE }
|
||
]
|
||
},
|
||
{
|
||
input: 'Aaa',
|
||
result: [{ data: 'Aaa', mode: Mode.BYTE }]
|
||
},
|
||
{
|
||
input: 'Aa12345A',
|
||
result: [
|
||
{ data: 'Aa', mode: Mode.BYTE },
|
||
{ data: '12345A', mode: Mode.ALPHANUMERIC }
|
||
]
|
||
},
|
||
{
|
||
input: 'ABC\nDEF',
|
||
result: [
|
||
{ data: 'ABC\nDEF', mode: Mode.BYTE }
|
||
]
|
||
}
|
||
]
|
||
|
||
const kanjiTestData = [
|
||
{
|
||
input: '乂ЁЖぞβ',
|
||
result: [{ data: '乂ЁЖぞβ', mode: Mode.KANJI }]
|
||
},
|
||
{
|
||
input: 'ΑΒΓψωЮЯабв',
|
||
result: [{ data: 'ΑΒΓψωЮЯабв', mode: Mode.KANJI }]
|
||
},
|
||
{
|
||
input: '皿a晒三',
|
||
result: [
|
||
{ data: '皿a', mode: Mode.BYTE },
|
||
{ data: '晒三', mode: Mode.KANJI }
|
||
]
|
||
},
|
||
{
|
||
input: '皿a\n晒三',
|
||
result: [
|
||
{ data: '皿a\n', mode: Mode.BYTE },
|
||
{ data: '晒三', mode: Mode.KANJI }
|
||
]
|
||
}
|
||
]
|
||
|
||
testData = testData.concat(kanjiTestData)
|
||
|
||
test('Segments from array', function (t) {
|
||
t.deepEqual(
|
||
Segments.fromArray(['abcdef', '12345']),
|
||
[new ByteData('abcdef'), new NumericData('12345')],
|
||
'Should return correct segment from array of string')
|
||
|
||
t.deepEqual(
|
||
Segments.fromArray([{ data: 'abcdef', mode: Mode.BYTE }, { data: '12345', mode: Mode.NUMERIC }]),
|
||
[new ByteData('abcdef'), new NumericData('12345')],
|
||
'Should return correct segment from array of objects')
|
||
|
||
t.deepEqual(
|
||
Segments.fromArray([{ data: 'abcdef', mode: 'byte' }, { data: '12345', mode: 'numeric' }]),
|
||
[new ByteData('abcdef'), new NumericData('12345')],
|
||
'Should return correct segment from array of objects if mode is specified as string')
|
||
|
||
t.deepEqual(
|
||
Segments.fromArray([{ data: 'abcdef' }, { data: '12345' }]),
|
||
[new ByteData('abcdef'), new NumericData('12345')],
|
||
'Should return correct segment from array of objects if mode is not specified')
|
||
|
||
t.deepEqual(Segments.fromArray([{}]), [],
|
||
'Should return an empty array')
|
||
|
||
t.throw(function () { Segments.fromArray([{ data: 'ABCDE', mode: 'numeric' }]) },
|
||
'Should throw if segment cannot be encoded with specified mode')
|
||
|
||
t.deepEqual(
|
||
Segments.fromArray([{ data: '0123', mode: Mode.KANJI }]), [new ByteData('0123')],
|
||
'Should use Byte mode if kanji support is disabled')
|
||
|
||
t.end()
|
||
})
|
||
|
||
test('Segments optimization', function (t) {
|
||
t.deepEqual(Segments.fromString('乂ЁЖ', 1), Segments.fromArray([{ data: '乂ЁЖ', mode: 'byte' }]),
|
||
'Should use Byte mode if Kanji support is disabled')
|
||
|
||
Utils.setToSJISFunction(toSJIS)
|
||
testData.forEach(function (data) {
|
||
t.deepEqual(Segments.fromString(data.input, 1), Segments.fromArray(data.result))
|
||
})
|
||
|
||
t.end()
|
||
})
|
||
|
||
test('Segments raw split', function (t) {
|
||
const splitted = [
|
||
new ByteData('abc'),
|
||
new AlphanumericData('DEF'),
|
||
new NumericData('123')
|
||
]
|
||
|
||
t.deepEqual(Segments.rawSplit('abcDEF123'), splitted)
|
||
|
||
t.end()
|
||
})
|