Ext.define('PageAnalyzer.models.ComponentTreeNode', { extend: 'Ext.data.Model', fields: [ { name: 'text', type: 'string' }, { name: 'compId', type: 'string' }, { name: 'refName', type: 'string' }, { name: 'width', type: 'int'}, { name: 'height', type: 'int'}, { name: 'x', type: 'int'}, { name: 'y', type: 'int'}, { name: 'cssClass', type: 'string'}, { name: 'xtype', type: 'string' }, { name: 'rendered', type: 'boolean' }, { name: 'hidden', type: 'boolean' }, { name: 'isContainer', type: 'boolean' }, { name: 'isElement', type: 'boolean' }, { name: 'isComponent', type: 'boolean', defualtValue: false } ], jasmineTpl: [ 'expect(Ext.widget({cfg})).toHaveLayout({spec});' ], isSimpleType: function(val) { // var t = (typeof val); // return (t == 'number' || t == 'string' || t == 'boolean'); return Ext.isPrimitive(val); }, isArray: function(val) { var t = (typeof val); return (Ext.isArray(val) || t == 'Ext.util.Queue'); }, getComponentConfig: function(initCfg) { var me = this, cfg = {}, arry; initCfg = (initCfg.isComponent) ? initCfg.initialConfig : initCfg; if (me.isSimpleType(initCfg)) { return initCfg; } Ext.Object.each(initCfg, function(name, val){ if (val) { if (me.isSimpleType(val)) { cfg[name] = val; } else if (val.isComponent) { cfg[name] = me.getComponentConfig(val.initialConfig); cfg['xtype'] = val.getXType(); } else if (me.isArray(val)) { arry = cfg[name] || (cfg[name] = []); Ext.each(val, function(v) { if (v) { arry.push(me.getComponentConfig(v)); } }, me); } else { cfg[name] = me.getComponentConfig(val); } } }); return cfg; }, getTestSpec: function() { var data = this.data, spec = {}, children = this.childNodes, len = children.length, specs = [], child, i, name; if (data.refName == 'items' || data.refName == 'dockedItems') { for (i = 0; i < len; i++) { child = children[i]; if (!child.data.hidden) { spec[i] = child.getTestSpec(); } } return spec; } else if (data.isElement) { var dims = []; dims.push(data.x, data.y, data.width, data.height); return { xywh: dims.join(' ') }; } else { for (i = 0; i < len; i++) { child = children[i]; name = child.data.refName; if (!child.data.hidden) { spec[name] = child.getTestSpec(); } } return spec; } }, getJasmineSpec: function(){ var me = this, data = me.data, ctx = { spec: Ext.JSON.encodeValue(me.getTestSpec(), '\n') }; return Ext.XTemplate.getTpl(me, 'jasmineTpl').apply(ctx); } });