Builder: fix join of pre_ops and post_ops arrays

https://fedorahosted.org/freeipa/ticket/3235
This commit is contained in:
Petr Vobornik
2013-04-26 15:13:26 +02:00
parent 504fa6c786
commit 348dc948ff
4 changed files with 107 additions and 5 deletions

View File

@@ -220,8 +220,8 @@ define(['dojo/_base/declare',
cs.pre_ops = cs.pre_ops || [];
cs.post_ops = cs.post_ops || [];
if (pre) cs.pre_ops.push.call(cs.pre_ops, pre);
if (post) cs.post_ops.push.call(cs.post_ops, post);
if (pre) cs.pre_ops.push.apply(cs.pre_ops, pre);
if (post) cs.post_ops.push.apply(cs.post_ops, post);
}
cs.spec = cs.spec || {};

View File

@@ -102,8 +102,8 @@ define(['dojo/_base/declare',
var cs = construct.clone(old_cs);
cs.type = new_type;
if (def_cs.pre_ops) cs.pre_ops.push.call(cs.pre_ops, def_cs.pre_ops);
if (def_cs.post_ops) cs.post_ops.push.call(cs.post_ops, def_cs.post_ops);
if (def_cs.pre_ops) cs.pre_ops.push.apply(cs.pre_ops, def_cs.pre_ops);
if (def_cs.post_ops) cs.post_ops.push.apply(cs.post_ops, def_cs.post_ops);
if (def_cs.factory) cs.factory = def_cs.factory;
if (def_cs.ctor) cs.ctor = def_cs.ctor;
if (def_cs.spec) {

View File

@@ -3,6 +3,8 @@
<head>
<title>IPA utils test suite</title>
<link rel="stylesheet" href="qunit.css" type="text/css" media="screen">
<script type="text/javascript" src="../js/libs/jquery.js"></script>
<script type="text/javascript" src="../js/libs/jquery.ordered-map.js"></script>
<script type="text/javascript" src="qunit.js"></script>
<script type="text/javascript" src="config.js"></script>
<script type="text/javascript" src="../js/dojo/dojo.js"></script>

View File

@@ -21,11 +21,12 @@
define([
'dojo/_base/declare',
'freeipa/_base/Builder',
'freeipa/_base/Construct_registry',
'freeipa/_base/Spec_mod',
'freeipa/ipa',
'freeipa/spec_util'
],
function(declare, Builder, Spec_mod, IPA, su) { return function() {
function(declare, Builder, C_reg, Spec_mod, IPA, su) { return function() {
module('build',{
@@ -159,6 +160,105 @@ test('Testing Spec_mod', function() {
deepEqual(spec, { a: ['a1', 'new', 'a2', 'a3'] }, 'Add on position');
});
test('Testing Construct registry', function() {
var undefined;
var cr = new C_reg();
// test simple ctor registration
var ctor = declare([], {});
cr.register('ctor', ctor);
var ctor_cs = cr.get('ctor');
equals(ctor_cs.type, 'ctor', 'Ctor: Match type');
equals(ctor_cs.ctor, ctor, 'Ctor: Match ctor');
equals(ctor_cs.factory, undefined, 'Ctor: Match factory');
equals(ctor_cs.pre_ops.length, 0, 'Ctor: No pre_ops');
equals(ctor_cs.post_ops.length, 0, 'Ctor: No post_ops');
// test simple factory registration
var fac = function(){};
cr.register('fac', fac);
var fac_cs = cr.get('fac');
equals(fac_cs.type, 'fac', 'Factory: Match type');
equals(fac_cs.ctor, undefined, 'Factory: Match ctor');
equals(fac_cs.factory, fac, 'Factory: Match factory');
equals(fac_cs.pre_ops.length, 0, 'Factory: No pre_ops');
equals(fac_cs.post_ops.length, 0, 'Factory: No post_ops');
// test complex registration
var spec = { name: 'spec' };
var cs = {
type: 'complex',
ctor: ctor,
factory: fac, // for next test
spec: spec
};
cr.register(cs);
var complex_cs = cr.get('complex');
equals(complex_cs.type, 'complex', 'Complex: Match type');
equals(complex_cs.ctor, ctor, 'Complex: Match ctor');
equals(complex_cs.factory, fac, 'Complex: Match factory');
equals(complex_cs.pre_ops.length, 0, 'Complex: No pre_ops');
equals(complex_cs.post_ops.length, 0, 'Complex: No post_ops');
deepEqual(complex_cs.spec, spec, 'Complex: Match spec');
// copy: new cs based on existing
cr.copy('complex', 'copy', {}); // pure copy
var copy_cs = cr.get('copy');
equals(copy_cs.type, 'copy', 'Copy: Match type');
equals(copy_cs.ctor, ctor, 'Copy: Match ctor');
equals(copy_cs.factory, fac, 'Copy: Match factory');
equals(copy_cs.pre_ops.length, 0, 'Copy: No pre_ops');
equals(copy_cs.post_ops.length, 0, 'Copy: No post_ops');
deepEqual(copy_cs.spec, spec, 'Copy: Match spec');
// add post op and pre op to complex
var op1 = function() {};
var op2 = function() {};
var op3 = function() {};
var op4 = function() {};
cr.register_pre_op('complex', op1);
cr.register_pre_op('complex', op2, true /* first*/);
deepEqual(complex_cs.pre_ops, [op2, op1], 'Adding pre_ops');
cr.register_post_op('complex', op3);
cr.register_post_op('complex', op4, true);
deepEqual(complex_cs.post_ops, [op4, op3], 'Adding post_ops');
// copy: altered
var ctor2 = declare([], {});
var fac2 = function() {};
var op5 = function() {};
var op6 = function() {};
cr.copy('complex', 'copy2', {
ctor: ctor2,
factory: fac2,
spec: {
foo: 'bar'
},
pre_ops: [op5],
post_ops: [op6]
});
var a_copy_cs = cr.get('copy2');
equals(a_copy_cs.type, 'copy2', 'Altered copy: Match type');
equals(a_copy_cs.ctor, ctor2, 'Altered copy: Match ctor');
equals(a_copy_cs.factory, fac2, 'Altered copy: Match factory');
deepEqual(a_copy_cs.spec, {
name: 'spec',
foo: 'bar'
}, 'Altered copy: Match spec');
deepEqual(a_copy_cs.pre_ops, [op2, op1, op5], 'Altered copy: Match pre_ops');
deepEqual(a_copy_cs.post_ops, [op4, op3, op6], 'Altered copy: Match post_ops');
});
};});