var test = require('tap').test var libxml = require('libxmljs') var svgRender = require('renderer/svg') test('svgrender interface', function (t) { t.ok(svgRender.hasOwnProperty('renderBits'), 'function "renderBits" should be defined') t.throws(function () { svgRender.renderBits() }, 'should throws if called without params') t.throws(function () { svgRender.renderBits([]) }, 'should throws if called without "width" param') t.throws(function () { svgRender.renderBits([], '') }, 'should throws if called with invalid "width" param') t.throws(function () { svgRender.renderBits(null, 0) }, 'should throws if called with undefined "bits" param') t.throws(function () { svgRender.renderBits('', 0) }, 'should throws if "bits" param is not an array') t.end() }) test('svgrender output', function (t) { var expectedWidth = 2 var expectedMargin = 8 var expectedScale = 5 var expectedQrCodeSize = '26' // qrcode size = width * scale + margin * 2 var expectedLightColor = '#AAAAAA' var expectedDarkColor = '#555555' var bits = [1, 1, 0, 1] var expectedTrueBitNumber = bits.filter(function (b) { return b }).length var xml = svgRender.renderBits(bits, expectedWidth, { scale: expectedScale, margin: expectedMargin, lightColor: expectedLightColor, darkColor: expectedDarkColor }) var xmlDoc = libxml.parseXml(xml) t.equal(xmlDoc.errors.length, 0, 'should output a valid xml') var rootElem = xmlDoc.root() t.equal('svg', rootElem.name(), 'should have <svg> has root element') t.equal(rootElem.attr('width').value(), expectedQrCodeSize, 'should have a valid width') t.equal(rootElem.attr('height').value(), expectedQrCodeSize, 'should have a valid height') var rectElem = rootElem.child(1) t.equal(rectElem.name(), 'rect', 'should have <rect> as first child element') t.equal(rectElem.attr('width').value(), expectedQrCodeSize, 'should have a valid rect width') t.equal(rectElem.attr('height').value(), expectedQrCodeSize, 'should have a valid rect height') t.equal(rectElem.attr('fill').value(), expectedLightColor, 'should have the background color specified in options') var dotDef = rectElem.nextElement() t.equal(dotDef.name(), 'defs', 'should have a <defs> element') var dotRect = dotDef.child(0) t.equal(dotRect.name(), 'rect', 'should have a <rect> definition') t.equal(dotRect.attr('width').value(), expectedScale.toString(), 'should have a valid rect width') t.equal(dotRect.attr('height').value(), expectedScale.toString(), 'should have a valid rect height') var gElem = dotDef.nextElement() t.equal(gElem.name(), 'g', 'should have a <g> element') t.equal(gElem.attr('fill').value(), expectedDarkColor, 'should have the color specified in options') var useElems = gElem.find('*') t.equal(useElems.length, expectedTrueBitNumber, 'should have one element for each "true" bit') t.equal(useElems[0].attr('x').value(), expectedMargin.toString(), 'should have a left margin as specified in options') t.equal(useElems[0].attr('y').value(), expectedMargin.toString(), 'should have a top margin as specified in options') t.end() })