SOURCE CODE: Uize.Test.Class.mChildObjectBindings (view docs)

/*______________
|       ______  |   U I Z E    J A V A S C R I P T    F R A M E W O R K
|     /      /  |   ---------------------------------------------------
|    /    O /   |    MODULE : Uize.Test.Class.mChildObjectBindings Class
|   /    / /    |
|  /    / /  /| |    ONLINE : http://uize.com
| /____/ /__/_| | COPYRIGHT : (c)2014-2016 UIZE
|          /___ |   LICENSE : Available under MIT License or GNU General Public License
|_______________|             http://uize.com/license.html
*/

/* Module Meta Data
  type: Class
  importance: 4
  codeCompleteness: 100
  docCompleteness: 5
*/

/*?
  Introduction
    The =Uize.Test.Class.mChildObjectBindings= module provides convenience methods for writing test cases against =Uize.Class= subclass modules that mix-in =Uize.Class.mChildObjectBindings=.

    *DEVELOPERS:* `Ben Ilegbodu`, original code contributed by `Zazzle Inc.`
*/

Uize.module ({
  name:'Uize.Test.Class.mChildObjectBindings',
  required:[
    'Uize.Data.Compare',
    'Uize.Array.Util'
  ],
  builder:function () {
    'use strict';

    var
      _Uize = Uize
    ;

    return function (_class) {
      _class.declare({
        staticMethods:{
          childObjectBindingsTest:function(_properties) {
            var
              _childObjectsTestName = _properties.childObjectTestsName,
              _childObjectTestName = _properties.childObjectTestName,
              _childObjectsPropertyName = _properties.childObjectsPropertyName
            ;

            _class.declare({
              staticMethods:_Uize.pairUp(
                _childObjectTestName,
                  function(_testParams) {
                    var
                      _testClass = this,
                      _stateProperty = _testParams.propertyName
                    ;

                    function _getInstance(m, _instanceProperties) {
                      return m.setInstance(
                        _Uize.copy(_testParams.instanceProperties, _instanceProperties)
                      );
                    }

                    return _testClass.resolve(
                      _Uize.copyInto(
                        {
                          title:'CHILD OBJECT BINDING TEST: ' + _stateProperty,
                          test:_Uize.Array.Util.flatten(
                            _Uize.map(
                              _testParams.cases,
                              function(_case) {
                                var
                                  _childName = _case.child,
                                  _childProperty = _case.property,
                                  _direction = _case.direction,
                                  _instanceProperties = _case.instanceProperties
                                ;

                                return Uize.Array.Util.flatten(
                                  _Uize.map(
                                    _case.expect,
                                    function(_expect) {
                                      var _expectTests = [];

                                      if (_direction.indexOf('->') > -1)
                                        _expectTests.push({
                                          title:'When instance is created and the ' + _stateProperty + ' property is set to {' + _expect.a + '}, the ' + _childProperty + ' property of ' + _childName + ' child object is set to {' + _expect.b + '}',
                                          test:function() {
                                            var _instance = _getInstance(this, _instanceProperties);

                                            _instance.set(_expect.aState || _Uize.pairUp(_stateProperty, _expect.a));

                                            return this.expect(_expect.b, _instance[_childObjectsPropertyName][_childName].get(_childProperty));
                                          }
                                        });

                                      if (_direction.indexOf('<-') > -1)
                                        _expectTests.push({
                                          title:'When instance is created and the ' + _childProperty + ' property of ' + _childName + ' child object is set to {' + _expect.b + '}, the ' + _stateProperty + ' property is set to {' + _expect.a + '}',
                                          test:function() {
                                            var _instance = _getInstance(this, _instanceProperties);

                                            _instance[_childObjectsPropertyName][_childName].set(_expect.bState || _Uize.pairUp(_childProperty, _expect.b));

                                            return this.expect(_expect.a, _instance.get(_stateProperty));
                                          }
                                        });

                                      return _expectTests;
                                    }
                                  )
                                );
                              }
                            )
                          )
                        },
                        _testParams.testProperties
                      )
                    );
                  },
                _childObjectsTestName,
                  function(_childObjectBindingsTests) {
                    return this.makeMultipleDeclarativeCasesTest(
                      'Child Object Bindings Tests',
                      _childObjectBindingsTests,
                      this[_childObjectTestName]
                    );
                  }
              )
            });
          }
        }
      });
    };
  }
});