/** * @file layui - 测试 * @author xuexb */ /* global layui */ /* eslint-disable max-nested-callbacks, fecs-indent */ var $ = layui.$; /** * 是否基于`phantomjs`测试, 因为有些特殊的case在ie中是不可用的, 比如: `window.event = {}` * * @type {boolean} */ var IS_PHANTOMJS = layui.device('phantomjs').phantomjs; describe('layui', function() { it('version', function() { expect(layui.v).to.be.a('string'); expect(layui.v).to.not.be.empty; }); it('layui.config', function() { expect(layui.config()).to.deep.equal(layui); expect(layui.config({ testName: 'layui' })).to.deep.equal(layui); expect(layui.cache.testName).to.equal('layui'); }); describe('layui.router', function() { var defaultData = { path: [], search: {}, hash: '' }; it('default params', function() { expect(layui.router).to.be.a('function'); expect(layui.router()).to.be.a('object').and.deep.equal(defaultData); }); it('error router', function() { [ null, '', '#123', '123', '##' ].forEach(function(key) { expect(layui.router(key)).to.deep.equal(defaultData); }); }); it('router querystring', function() { expect(layui.router('#/a=1/b=2/c=')).to.deep.equal($.extend({}, defaultData, { href: '/a=1/b=2/c=', search: { a: '1', b: '2', c: '' } })); expect(layui.router('#/a=测试/b=2').search).to.deep.equal({ a: '测试', b: '2' }); // todo // urlencode // urldecode }); it('router hash', function() { expect(layui.router('#/name#layui')).to.deep.equal($.extend({}, defaultData, { hash: '#layui', path: ['name'], href: '/name#layui' })); expect(layui.router('#/name#layui').hash).to.equal('#layui'); expect(layui.router('#/name#layui=1').hash).to.equal('#layui=1'); expect(layui.router('#/name##layui').hash).to.equal('##layui'); expect(layui.router('#/name=1#layui').hash).to.equal('#layui'); expect(layui.router('#/name=1/b=2#layui').hash).to.equal('#layui'); }); it('router path', function() { expect(layui.router('#/a/b/c=2#hash')).to.deep.equal({ path: ['a', 'b'], search: { c: '2' }, hash: '#hash', href: '/a/b/c=2#hash' }); }); }); describe('layui.each', function() { it('check params', function() { expect(layui.each).to.be.a('function'); expect(layui.each()).to.deep.equal(layui); expect(layui.each({})).to.deep.equal(layui); expect(layui.each([])).to.deep.equal(layui); expect(layui.each({}, function() {})).to.deep.equal(layui); expect(layui.each([], function() {})).to.deep.equal(layui); }); it('null params', function(done) { var index = 0; layui.each(null, function(index) { index += 1; }); setTimeout(function() { expect(index).to.equal(0); done(); }); }); it('object each', function(done) { layui.each({ name: 'layui' }, function(key, value) { expect(this + '').to.deep.equal(value).and.equal('layui'); expect(key).to.equal('name'); done(); }); }); it('array each', function(done) { layui.each([ 'layui' ], function(index, value) { expect(this + '').to.deep.equal(value).and.equal('layui'); expect(index).to.equal(0); done(); }); }); it('break array each', function() { var arr = new Array(100).join(',').split(','); var flag = -1; layui.each(arr, function(index) { flag = index; if (index > 5) { return true; } }); expect(flag).to.equal(6); flag = -1; layui.each(arr, function(index) { flag = index; if (index > 5) { return false; } }); expect(flag).to.equal(99); }); it('break object each', function() { var obj = { name: 'layui', version: '2.x' }; var flag = null; layui.each(obj, function(key) { flag = key; return true; }); expect(flag).to.equal('name'); flag = null; layui.each(obj, function(key) { flag = key; return false; }); expect(flag).to.equal('version'); }); }); describe('layui.img', function() { var base64 = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; it('success callback', function(done) { layui.img(base64, function(img) { expect(img).to.not.undefined; expect(typeof(img)).to.equal('object', '是img对象'); expect(img.nodeType).to.equal(1, 'img标签节点'); // 在ie11中不通过, 原因目前不明 // expect(img.width).to.equal(1); // expect(img.height).to.equal(1); done(); }); }); it('error callback', function(done) { layui.img('/api/mock?statusCode=404', function() {}, function(e) { expect(e).to.not.undefined; done(); }); }); // 先删除, 因为没有哪个图片是决定不变的 // it('http 200', function (done) { // layui.img('https://www.baidu.com/img/bd_logo1.png', function (img) { // expect(img).to.not.undefined; // done(); // }); // }); // 由于没有超时配置, 在部分设备中, dns解析可能超时 // it('http 404', function (done) { // layui.img('http://www.404.xx/logo.404.gif', function () {}, function (e) { // expect(e).to.not.undefined; // done(); // }); // }); it('load complete', function(done) { layui.img(base64, function() { layui.img(base64, function(img) { expect(img).to.not.undefined; done(); }); }); }); }); it('layui.hint', function() { expect(layui.hint).to.be.a('function'); expect(layui.hint()).to.be.a('object'); expect(layui.hint().error).to.be.a('function'); }); describe('layui.stope', function() { it('stopPropagation', function(done) { layui.stope({ stopPropagation: function(e) { expect(e).to.be.undefined; done(); } }); }); it('cancelBubble', function() { var event = {}; layui.stope(event); expect(event.cancelBubble).to.be.true; }); // ie中不支持, 只针对phantomjs测试 if (IS_PHANTOMJS) { it('window.event', function() { var old = window.event; var event = window.event = {}; layui.stope(); expect(event.cancelBubble).to.be.true; window.event = old; }); } }); describe('layui.onevent', function() { it('check params and return value', function() { expect(layui.onevent).to.be.a('function'); expect(layui.onevent()).to.deep.equal(layui); expect(layui.onevent([], [], [])).to.deep.equal(layui); expect(layui.onevent({}, {}, {})).to.deep.equal(layui); expect(layui.onevent('test-' + Date.now(), 'click', function() {})).to.not.deep .equal(layui); }); it('bind event', function(done) { var id = 'test-bind-event'; var data = { name: 'layui' }; layui.onevent(id, 'click', function(param) { expect(this).to.deep.equal(layui); expect(param).to.deep.equal(data); done(); }); layui.event(id, 'click', data); }); it('coverage of the same name event', function() { var id = 'test-same-event'; var index = 0; layui.onevent(id, 'click', function() { index = 1; }); layui.onevent(id, 'click', function() { index = 2; }); layui.event(id, 'click'); expect(index).to.equal(2); }); }); describe('layui.event', function() { it('trigger event', function(done) { layui.onevent('test-trigger', 'click(*)', function(data) { expect(data).to.be.true; done(); }); layui.event('test-trigger', 'click(*)', true); }); it.skip('trigger multiple', function() { var index = 0; var id = 'test-trigger-multiple'; layui.onevent(id, 'nav', function() { index += 1; }); layui.event(id, 'nav'); layui.event(id, 'nav'); layui.event(id, 'nav'); expect(index).to.equal(3); }); it('return value', function() { expect(layui.event('id', 'event')).to.be.null; // 只有在返回 false 时, 结果才是 false layui.onevent('test-return-value-1', 'click', function(data) { return data; }); expect(layui.event('test-return-value-1', 'click', false)).to.be.false; expect(layui.event('test-return-value-1', 'click', true)).to.be.null; expect(layui.event('test-return-value-1', 'click')).to.be.null; }); }); describe('layui.sort', function() { var numberData = [{ name: 1 }, { name: 3 }, { name: 2 } ]; it('check params and return value', function() { expect(layui.sort()).to.deep.equal([], '空参数时默认为空数组'); expect(layui.sort({})).to.deep.equal({}, '只传空对象默认返回'); expect(layui.sort({ name: 'layui' })).to.deep.equal({ name: 'layui' }, '只传一个对象参数时返回'); expect(layui.sort([{ name: 'layui' }], 'name')).to.deep.equal([{ name: 'layui' }]); expect(layui.sort([{ name: 'layui' }], 'name', true)).to.deep.equal([{ name: 'layui' }]); }); // 测试是否污染原数据 it('clone object', function() { var clone = layui.sort(numberData, 'name'); // 往clone对象添加 clone.push('layui'); expect(clone).to.have.lengthOf(4); expect(numberData).to.have.lengthOf(3); }); it('format value number', function() { var result = layui.sort([{ key: '1' }, { key: '-1' }, { key: 2 }, { key: 3 } ], 'key'); expect(result).to.deep.equal([{ key: '-1' }, { key: '1' }, { key: 2 }, { key: 3 } ]); }); it('asc order', function() { var result = layui.sort(numberData, 'name'); expect(result).to.deep.equal([{ name: 1 }, { name: 2 }, { name: 3 } ]); }); it('desc order', function() { var result = layui.sort(numberData, 'name', true); expect(result).to.deep.equal([{ name: 3 }, { name: 2 }, { name: 1 } ]); }); it('error data', function() { var data = [ // null, { name: 5 }, {}, [], 'test', { name: '3' } ]; expect(layui.sort(data, 'name')).to.deep.equal([{}, [], 'test', { name: '3' }, { name: 5 } ]); }); }); it('layui.device', function() { expect(layui.device).to.be.a('function'); expect(layui.device()).to.be.a('object'); expect(layui.device().ie).to.be.not.undefined; expect(layui.device().ios).to.be.not.undefined; expect(layui.device().android).to.be.not.undefined; expect(layui.device().weixin).to.be.a('boolean'); expect(layui.device('weixin').weixin).to.be.false; expect(layui.device('.*')['.*']).to.be.not.empty; expect(layui.device('layui.com')['layui.com']).to.be.false; }); describe('layui.getStyle', function() { it('real test', function() { var elem = $('
').css({ position: 'fixed', zIndex: 10 }).appendTo('body').get(0); expect(layui.getStyle(elem, 'position')).to.equal('fixed'); expect(layui.getStyle(elem, 'z-index')).to.equal('10'); }); it('mock currentStyle', function(done) { var node = { currentStyle: { getPropertyValue: function(name) { expect(name).to.equal('layui'); done(); } } }; layui.getStyle(node, 'layui'); }); }); it('layui.extend', function() { expect(layui.extend).to.be.a('function'); expect(layui.extend()).to.deep.equal(layui); expect(layui.extend({ v: 'v', util: 'util' })).to.deep.equal(layui); var id = 'test-extend-' + Date.now(); var data = {}; data[id] = id; expect(layui.modules[id]).to.be.undefined; layui.extend(data); expect(layui.modules[id]).to.be.not.undefined; expect(layui.modules[id]).to.equal(id); delete layui.modules[id]; }); describe('layui.data', function() { if (IS_PHANTOMJS) { it('not support JSON', function() { var old = window.JSON; window.JSON = null; expect(layui.data()).to.be.undefined; window.JSON = {}; expect(layui.data()).to.be.undefined; window.JSON = old; }); } // 在支持情况下才测试 if (window.localStorage) { it('delete table data', function() { var id = 'test-delete-data'; localStorage[id] = true; expect(localStorage[id]).to.equal('true'); expect(layui.data(id, null)).to.be.true; expect(localStorage[id]).to.be.undefined; }); it('get table data', function() { var table = 'test-get-table-data'; expect(layui.data(table)).to.deep.equal({}); layui.data(table, { key: 'name', value: 'layui' }); expect(layui.data(table)).to.deep.equal({ name: 'layui' }); // 删除数据 layui.data(table, null); }); it('get data', function() { var id = 'test-get-data'; // 直接获取肯定为空 expect(layui.data(null, id)).to.be.undefined; // 写入数据 expect(layui.data(null, { key: id, value: true })).to.be.true; expect(layui.data(null, id)).to.be.true; // 清除数据 layui.data(null, { key: id, remove: true }); }); it('remove data', function() { var id = 'test-remove-data'; layui.data(null, { key: id, value: true }); expect(layui.data(null, id)).to.be.true; layui.data(null, { key: id, remove: true }); expect(layui.data(null, id)).to.be.undefined; }); } }); }); /* eslint-enable max-nested-callbacks, fecs-indent */