121 lines
4.2 KiB
JavaScript
121 lines
4.2 KiB
JavaScript
const test = require('tap').test
|
|
const ECLevel = require('core/error-correction-level')
|
|
const Version = require('core/version')
|
|
const QRCode = require('core/qrcode')
|
|
const toSJIS = require('helper/to-sjis')
|
|
|
|
test('QRCode interface', function (t) {
|
|
t.type(QRCode.create, 'function', 'Should have "create" function')
|
|
t.throw(function () { QRCode.create() }, 'Should throw if no data is provided')
|
|
t.notThrow(function () { QRCode.create('1234567') }, 'Should not throw')
|
|
|
|
let qr = QRCode.create('a123456A', {
|
|
version: 1,
|
|
maskPattern: 1,
|
|
errorCorrectionLevel: 'H'
|
|
})
|
|
t.equal(qr.modules.size, 21, 'Should return correct modules count')
|
|
t.equal(qr.maskPattern, 1, 'Should return correct mask pattern')
|
|
|
|
const darkModule = qr.modules.get(qr.modules.size - 8, 8)
|
|
t.ok(darkModule, 'Should have a dark module at coords [size-8][8]')
|
|
|
|
t.throw(function () {
|
|
qr = QRCode.create({})
|
|
}, 'Should throw if invalid data is passed')
|
|
|
|
t.notThrow(function () {
|
|
qr = QRCode.create('AAAAA00000', { version: 5 })
|
|
}, 'Should accept data as string')
|
|
|
|
t.notThrow(function () {
|
|
qr = QRCode.create([
|
|
{ data: 'ABCDEFG', mode: 'alphanumeric' },
|
|
{ data: 'abcdefg' },
|
|
{ data: '晒三', mode: 'kanji' },
|
|
{ data: '0123456', mode: 'numeric' }
|
|
], { toSJISFunc: toSJIS })
|
|
}, 'Should accept data as array of objects')
|
|
|
|
t.notThrow(function () {
|
|
qr = QRCode.create('AAAAA00000', { errorCorrectionLevel: 'quartile' })
|
|
qr = QRCode.create('AAAAA00000', { errorCorrectionLevel: 'q' })
|
|
}, 'Should accept errorCorrectionLevel as string')
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('QRCode error correction', function (t) {
|
|
let qr
|
|
const ecValues = [
|
|
{ name: ['l', 'low'], level: ECLevel.L },
|
|
{ name: ['m', 'medium'], level: ECLevel.M },
|
|
{ name: ['q', 'quartile'], level: ECLevel.Q },
|
|
{ name: ['h', 'high'], level: ECLevel.H }
|
|
]
|
|
|
|
for (let l = 0; l < ecValues.length; l++) {
|
|
for (let i = 0; i < ecValues[l].name.length; i++) {
|
|
t.notThrow(function () {
|
|
qr = QRCode.create('ABCDEFG', { errorCorrectionLevel: ecValues[l].name[i] })
|
|
}, 'Should accept errorCorrectionLevel value: ' + ecValues[l].name[i])
|
|
|
|
t.deepEqual(qr.errorCorrectionLevel, ecValues[l].level,
|
|
'Should have correct errorCorrectionLevel value')
|
|
|
|
t.notThrow(function () {
|
|
qr = QRCode.create('ABCDEFG', { errorCorrectionLevel: ecValues[l].name[i].toUpperCase() })
|
|
}, 'Should accept errorCorrectionLevel value: ' + ecValues[l].name[i].toUpperCase())
|
|
|
|
t.deepEqual(qr.errorCorrectionLevel, ecValues[l].level,
|
|
'Should have correct errorCorrectionLevel value')
|
|
}
|
|
}
|
|
|
|
qr = QRCode.create('ABCDEFG')
|
|
t.equal(qr.errorCorrectionLevel, ECLevel.M, 'Should set default EC level to M')
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('QRCode version', function (t) {
|
|
let qr = QRCode.create('data', { version: 9, errorCorrectionLevel: ECLevel.M })
|
|
|
|
t.equal(qr.version, 9, 'Should create qrcode with correct version')
|
|
t.equal(qr.errorCorrectionLevel, ECLevel.M, 'Should set correct EC level')
|
|
|
|
t.throw(function () {
|
|
qr = QRCode.create(new Array(Version.getCapacity(2, ECLevel.H)).join('a'),
|
|
{ version: 1, errorCorrectionLevel: ECLevel.H })
|
|
}, 'Should throw if data cannot be contained with chosen version')
|
|
|
|
t.throw(function () {
|
|
qr = QRCode.create(new Array(Version.getCapacity(40, ECLevel.H) + 2).join('a'),
|
|
{ version: 40, errorCorrectionLevel: ECLevel.H })
|
|
}, 'Should throw if data cannot be contained in a qr code')
|
|
|
|
t.notThrow(function () {
|
|
qr = QRCode.create('abcdefg', { version: 'invalid' })
|
|
}, 'Should use best version if the one provided is invalid')
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('QRCode capacity', function (t) {
|
|
let qr
|
|
|
|
qr = QRCode.create([{ data: 'abcdefg', mode: 'byte' }])
|
|
t.equal(qr.version, 1, 'Should contain 7 byte characters')
|
|
|
|
qr = QRCode.create([{ data: '12345678901234567', mode: 'numeric' }])
|
|
t.equal(qr.version, 1, 'Should contain 17 numeric characters')
|
|
|
|
qr = QRCode.create([{ data: 'ABCDEFGHIL', mode: 'alphanumeric' }])
|
|
t.equal(qr.version, 1, 'Should contain 10 alphanumeric characters')
|
|
|
|
qr = QRCode.create([{ data: 'AIぐサ', mode: 'kanji' }],
|
|
{ toSJISFunc: toSJIS })
|
|
t.equal(qr.version, 1, 'Should contain 4 kanji characters')
|
|
|
|
t.end()
|
|
})
|