diff options
Diffstat (limited to 'test/WidgetsTest.js')
| -rw-r--r-- | test/WidgetsTest.js | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/test/WidgetsTest.js b/test/WidgetsTest.js new file mode 100644 index 00000000..a245abda --- /dev/null +++ b/test/WidgetsTest.js @@ -0,0 +1,269 @@ +WidgetTest = TestCase('WidgetTest'); + +WidgetTest.prototype.testRequired = function () { + var view = $('<input name="a" ng-required>'); + var scope = new nglr.Scope({$invalidWidgets:[]}); + var cntl = new nglr.TextController(view[0], 'a'); + cntl.updateView(scope); + assertTrue(view.hasClass('ng-validation-error')); + assertEquals("Required Value", view.attr('ng-error')); + scope.set('a', 'A'); + cntl.updateView(scope); + assertFalse(view.hasClass('ng-validation-error')); + assertEquals("undefined", typeof view.attr('ng-error')); +}; + +WidgetTest.prototype.testValidator = function () { + var view = $('<input name="a" ng-validate="testValidator:\'ABC\'">'); + var scope = new nglr.Scope({$invalidWidgets:[]}); + var cntl = new nglr.TextController(view[0], 'a'); + angular.validator.testValidator = function(value, expect){ + return value == expect ? null : "Error text"; + }; + + scope.set('a', ''); + cntl.updateView(scope); + assertEquals(view.hasClass('ng-validation-error'), false); + assertEquals(null, view.attr('ng-error')); + + scope.set('a', 'X'); + cntl.updateView(scope); + assertEquals(view.hasClass('ng-validation-error'), true); + assertEquals(view.attr('ng-error'), "Error text"); + assertEquals("Error text", view.attr('ng-error')); + + scope.set('a', 'ABC'); + cntl.updateView(scope); + assertEquals(view.hasClass('ng-validation-error'), false); + assertEquals(view.attr('ng-error'), null); + assertEquals(null, view.attr('ng-error')); + + delete angular.validator['testValidator']; +}; + +WidgetTest.prototype.testRequiredValidator = function () { + var view = $('<input name="a" ng-required ng-validate="testValidator:\'ABC\'">'); + var scope = new nglr.Scope({$invalidWidgets:[]}); + var cntl = new nglr.TextController(view[0], 'a'); + angular.validator.testValidator = function(value, expect){ + return value == expect ? null : "Error text"; + }; + + scope.set('a', ''); + cntl.updateView(scope); + assertEquals(view.hasClass('ng-validation-error'), true); + assertEquals("Required Value", view.attr('ng-error')); + + scope.set('a', 'X'); + cntl.updateView(scope); + assertEquals(view.hasClass('ng-validation-error'), true); + assertEquals("Error text", view.attr('ng-error')); + + scope.set('a', 'ABC'); + cntl.updateView(scope); + assertEquals(view.hasClass('ng-validation-error'), false); + assertEquals(null, view.attr('ng-error')); + + delete angular.validator['testValidator']; +}; + +TextController = TestCase("TextController"); + +TextController.prototype.testDatePicker = function() { + var input = $('<input type="text" ng-widget="datepicker">'); + input.data('scope', new nglr.Scope()); + var body = $(document.body); + body.append(input); + var binder = new nglr.Binder(input[0], new nglr.WidgetFactory()); + assertTrue('before', input.data('datepicker') === undefined); + binder.compile(); + assertTrue('after', input.data('datepicker') !== null); + assertTrue(body.html(), input.hasClass('hasDatepicker')); +}; + +RepeaterUpdater = TestCase("RepeaterUpdater"); + +RepeaterUpdater.prototype.testRemoveThenAdd = function() { + var view = $("<div><span/></div>"); + var template = function () { + return $("<li/>"); + }; + var repeater = new nglr.RepeaterUpdater(view.find("span"), "a in b", template, ""); + var scope = new nglr.Scope(); + scope.set('b', [1,2]); + + repeater.updateView(scope); + + scope.set('b', []); + repeater.updateView(scope); + + scope.set('b', [1]); + repeater.updateView(scope); + assertEquals(1, view.find("li").size()); +}; + +RepeaterUpdater.prototype.testShouldBindWidgetOnRepeaterClone = function(){ + //fail(); +}; + +RepeaterUpdater.prototype.testShouldThrowInformativeSyntaxError= function(){ + expectAsserts(1); + try { + var repeater = new nglr.RepeaterUpdater(null, "a=b"); + } catch (e) { + assertEquals("Expected ng-repeat in form of 'item in collection' but got 'a=b'.", e); + } +}; + +SelectControllerTest = TestCase("SelectControllerTest"); + +SelectControllerTest.prototype.testShouldUpdateModelNullOnNothingSelected = function(){ + var scope = new nglr.Scope(); + var view = {selectedIndex:-1, options:[]}; + var cntl = new nglr.SelectController(view, 'abc'); + cntl.updateModel(scope); + assertNull(scope.get('abc')); +}; + +SelectControllerTest.prototype.testShouldUpdateModelWhenNothingSelected = function(){ + var scope = new nglr.Scope(); + var view = {value:'123'}; + var cntl = new nglr.SelectController(view, 'abc'); + cntl.updateView(scope); + assertEquals("123", scope.get('abc')); +}; + +BindUpdaterTest = TestCase("BindUpdaterTest"); + +BindUpdaterTest.prototype.testShouldDisplayNothingForUndefined = function () { + var view = $('<span />'); + var controller = new nglr.BindUpdater(view[0], "{{a}}"); + var scope = new nglr.Scope(); + + scope.set('a', undefined); + controller.updateView(scope); + assertEquals("", view.text()); + + scope.set('a', null); + controller.updateView(scope); + assertEquals("", view.text()); +}; + +BindUpdaterTest.prototype.testShouldDisplayJsonForNonStrings = function () { + var view = $('<span />'); + var controller = new nglr.BindUpdater(view[0], "{{obj}}"); + + controller.updateView(new nglr.Scope({obj:[]})); + assertEquals("[]", view.text()); + + controller.updateView(new nglr.Scope({obj:{text:'abc'}})); + assertEquals('abc', nglr.fromJson(view.text()).text); +}; + + +BindUpdaterTest.prototype.testShouldInsertHtmlNode = function () { + var view = $('<span />'); + var controller = new nglr.BindUpdater(view[0], "<fake>&{{obj}}</fake>"); + var scope = new nglr.Scope(); + + scope.set("obj", $('<div>myDiv</div>')[0]); + controller.updateView(scope); + assertEquals("<fake>&myDiv</fake>", view.text()); +}; + + +BindUpdaterTest.prototype.testShouldDisplayTextMethod = function () { + var view = $('<div />'); + var controller = new nglr.BindUpdater(view[0], "{{obj}}"); + var scope = new nglr.Scope(); + + scope.set("obj", new angular.filter.Meta({text:function(){return "abc";}})); + controller.updateView(scope); + assertEquals("abc", view.text()); + + scope.set("obj", new angular.filter.Meta({text:"123"})); + controller.updateView(scope); + assertEquals("123", view.text()); + + scope.set("obj", {text:"123"}); + controller.updateView(scope); + assertEquals("123", nglr.fromJson(view.text()).text); +}; + +BindUpdaterTest.prototype.testShouldDisplayHtmlMethod = function () { + var view = $('<div />'); + var controller = new nglr.BindUpdater(view[0], "{{obj}}"); + var scope = new nglr.Scope(); + + scope.set("obj", new angular.filter.Meta({html:function(){return "a<div>b</div>c";}})); + controller.updateView(scope); + assertEquals("abc", view.text()); + + scope.set("obj", new angular.filter.Meta({html:"1<div>2</div>3"})); + controller.updateView(scope); + assertEquals("123", view.text()); + + scope.set("obj", {html:"123"}); + controller.updateView(scope); + assertEquals("123", nglr.fromJson(view.text()).html); +}; + +BindUpdaterTest.prototype.testUdateBoolean = function() { + var view = $('<div />'); + var controller = new nglr.BindUpdater(view[0], "{{true}}, {{false}}"); + controller.updateView(new nglr.Scope()); + assertEquals('true, false', view.text()); +}; + +BindAttrUpdaterTest = TestCase("BindAttrUpdaterTest"); + +BindAttrUpdaterTest.prototype.testShouldLoadBlankImageWhenBindingIsUndefined = function () { + var view = $('<img />'); + var controller = new nglr.BindAttrUpdater(view[0], {src: '{{imageUrl}}'}); + + var scope = new nglr.Scope(); + scope.set('imageUrl', undefined); + scope.set('config.server', 'http://server'); + + controller.updateView(scope); + assertEquals("http://server/images/blank.gif", view.attr('src')); +}; + +RepeaterUpdaterTest = TestCase("RepeaterUpdaterTest"); +RepeaterUpdaterTest.prototype.testShouldNotDieWhenRepeatExpressionIsNull = function() { + var rep = new nglr.RepeaterUpdater(null, "$item in items", null, null); + var scope = new nglr.Scope(); + scope.set('items', undefined); + rep.updateView(scope); +}; + +RepeaterUpdaterTest.prototype.testShouldIterateOverKeys = function() { + var rep = new nglr.RepeaterUpdater(null, "($k,_v) in items", null, null); + assertEquals("items", rep.iteratorExp); + assertEquals("_v", rep.valueExp); + assertEquals("$k", rep.keyExp); +}; + +EvalUpdaterTest = TestCase("EvalUpdaterTest"); +EvalUpdaterTest.prototype.testEvalThrowsException = function(){ + var view = $('<div/>'); + var eval = new nglr.EvalUpdater(view[0], 'undefined()'); + + eval.updateView(new nglr.Scope()); + assertTrue(!!view.attr('ng-error')); + assertTrue(view.hasClass('ng-exception')); + + eval.exp = "1"; + eval.updateView(new nglr.Scope()); + assertFalse(!!view.attr('ng-error')); + assertFalse(view.hasClass('ng-exception')); +}; + +RadioControllerTest = TestCase("RadioController"); +RadioControllerTest.prototype.testItShouldTreatTrueStringAsBoolean = function () { + var view = $('<input type="radio" name="select" value="true"/>'); + var radio = new nglr.RadioController(view[0], 'select'); + var scope = new nglr.Scope({select:true}); + radio.updateView(scope); + assertTrue(view[0].checked); +}; |
