aboutsummaryrefslogtreecommitdiffstats
path: root/test/WidgetsTest.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/WidgetsTest.js')
-rw-r--r--test/WidgetsTest.js269
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);
+};