angular-material-npfixed
Version:
The Angular Material project is an implementation of Material Design in Angular.js. This project provides a set of reusable, well-tested, and accessible Material Design UI components. Angular Material is supported internally at Google by the Angular.js, M
941 lines (729 loc) • 31.7 kB
JavaScript
describe('md-input-container directive', function() {
var $rootScope, $compile, $timeout, pageScope;
var invalidAnimation, messagesAnimation, messageAnimation;
var $animProvider;
beforeEach(module('ngAria', 'material.components.input', 'ngMessages'));
// Setup/grab our variables
beforeEach(inject(function($injector) {
$compile = $injector.get('$compile');
$timeout = $injector.get('$timeout');
$rootScope = $injector.get('$rootScope');
pageScope = $rootScope.$new();
}));
function setup(attrs, isForm) {
var container;
var template =
'<md-input-container>' +
' <label></label>' +
' <input ' + (attrs || '') + '>' +
'</md-input-container>';
if (isForm) {
template = '<form>' + template + '</form>';
}
container = $compile(template)(pageScope);
pageScope.$apply();
return container;
}
function compile(template) {
var container;
container = $compile(template)(pageScope);
pageScope.$apply();
return container;
}
it('should by default show error on $touched and $invalid', function() {
var el = setup('ng-model="foo"');
expect(el).not.toHaveClass('md-input-invalid');
var model = el.find('input').controller('ngModel');
model.$touched = model.$invalid = true;
pageScope.$apply();
expect(el).toHaveClass('md-input-invalid');
model.$touched = model.$invalid = false;
pageScope.$apply();
expect(el).not.toHaveClass('md-input-invalid');
});
it('should show error on $submitted and $invalid', function() {
var el = setup('ng-model="foo"', true);
expect(el.find('md-input-container')).not.toHaveClass('md-input-invalid');
var model = el.find('input').controller('ngModel');
model.$invalid = true;
var form = el.controller('form');
form.$submitted = true;
pageScope.$apply();
expect(el.find('md-input-container')).toHaveClass('md-input-invalid');
});
it('should show error on $submitted and $invalid with nested forms', function() {
var template =
'<form>' +
' <div ng-form>' +
' <md-input-container>' +
' <input ng-model="foo">' +
' <label></label>' +
' </md-input-container>' +
' </div>' +
'</form>';
var parentForm = $compile(template)(pageScope).find('div');
pageScope.$apply();
expect(parentForm.find('md-input-container')).not.toHaveClass('md-input-invalid');
var model = parentForm.find('input').controller('ngModel');
model.$invalid = true;
var form = parentForm.controller('form');
form.$submitted = true;
pageScope.$apply();
expect(parentForm.find('md-input-container')).toHaveClass('md-input-invalid');
});
it('should not show error on $invalid and not $submitted', function() {
var el = setup('ng-model="foo"', true);
expect(el.find('md-input-container')).not.toHaveClass('md-input-invalid');
var model = el.find('input').controller('ngModel');
model.$invalid = true;
pageScope.$apply();
expect(el.find('md-input-container')).not.toHaveClass('md-input-invalid');
});
it('should show error with given md-is-error expression', function() {
var el = $compile(
'<md-input-container md-is-error="isError">' +
' <input ng-model="foo">' +
'</md-input-container>')(pageScope);
pageScope.$apply();
expect(el).not.toHaveClass('md-input-invalid');
pageScope.$apply('isError = true');
expect(el).toHaveClass('md-input-invalid');
pageScope.$apply('isError = false');
expect(el).not.toHaveClass('md-input-invalid');
});
it('should set focus class on container', function() {
var el = setup();
expect(el).not.toHaveClass('md-input-focused');
el.find('input').triggerHandler('focus');
// Expect a slight delay (via $mdUtil.nextTick()) which fixes a tabbing issue in Safari, see
// https://github.com/angular/material/issues/4203 for more info.
expect(el).not.toHaveClass('md-input-focused');
$timeout.flush();
expect(el).toHaveClass('md-input-focused');
el.find('input').triggerHandler('blur');
// Again, expect the change to not be immediate
expect(el).toHaveClass('md-input-focused');
$timeout.flush();
expect(el).not.toHaveClass('md-input-focused');
});
it('not should set focus class on container if readonly', function() {
var el = setup('readonly');
expect(el).not.toHaveClass('md-input-focused');
el.find('input').triggerHandler('focus');
expect(el).not.toHaveClass('md-input-focused');
el.find('input').triggerHandler('blur');
expect(el).not.toHaveClass('md-input-focused');
});
it('should skip a hidden input', function() {
var container = setup('type="hidden"');
var controller = container.controller('mdInputContainer');
var textInput = angular.element('<input type="text">');
expect(controller.input).toBeUndefined();
container.append(textInput);
$compile(textInput)(pageScope);
expect(controller.input[0]).toBe(textInput[0]);
});
it('should set has-value class on container for non-ng-model input', function() {
var el = setup();
expect(el).not.toHaveClass('md-input-has-value');
el.find('input').val('123').triggerHandler('input');
expect(el).toHaveClass('md-input-has-value');
el.find('input').val('').triggerHandler('input');
expect(el).not.toHaveClass('md-input-has-value');
});
it('should set has-value class on container with ng-value', function() {
var el = setup('ng-value="value"');
pageScope.$apply('value = "My Value"');
expect(el).toHaveClass('md-input-has-value');
pageScope.$apply('value = ""');
expect(el).not.toHaveClass('md-input-has-value');
});
it('should set has-value class on container for ng-model input', function() {
pageScope.value = 'test';
var el = setup('ng-model="value"');
expect(el).toHaveClass('md-input-has-value');
pageScope.$apply('value = "3"');
expect(el).toHaveClass('md-input-has-value');
pageScope.$apply('value = null');
expect(el).not.toHaveClass('md-input-has-value');
});
it('should match label to given input id', function() {
var el = setup('id="foo"');
expect(el.find('label').attr('for')).toBe('foo');
expect(el.find('input').attr('id')).toBe('foo');
});
it('should match label to automatic input id', function() {
var el = setup();
expect(el.find('input').attr('id')).toBeTruthy();
expect(el.find('label').attr('for')).toBe(el.find('input').attr('id'));
});
it('should set the "step" attribute to "any" if "min" and "max" are specified', function() {
// check #7349 for more info
var el = setup('type="number" min="1" max="999"');
expect(el.find('input').attr('step')).toBe('any');
});
describe('md-no-asterisk', function() {
it('should not show asterisk on required label if disabled', function() {
var el = setup('md-no-asterisk required');
var ctrl = el.controller('mdInputContainer');
expect(ctrl.label).not.toHaveClass('md-required');
});
it('should not show an asterisk when attribute value is `true`', function() {
var el = setup('md-no-asterisk="true" required');
var ctrl = el.controller('mdInputContainer');
expect(ctrl.label).not.toHaveClass('md-required');
});
it('should show an asterisk when attribute value is `false`', function() {
var el = setup('md-no-asterisk="false" required');
var ctrl = el.controller('mdInputContainer');
expect(ctrl.label).toHaveClass('md-required');
});
});
describe('md-maxlength', function() {
function getCharCounter(el) {
return angular.element(el[0].querySelector('.md-char-counter'));
}
it('should work with a constant', function() {
var el = $compile(
'<form name="form">' +
' <md-input-container>' +
' <input md-maxlength="5" ng-model="foo" name="foo">' +
' </md-input-container>' +
'</form>')(pageScope);
pageScope.$apply();
// Flush any pending $mdUtil.nextTick calls
$timeout.flush();
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).text()).toBe('0 / 5');
pageScope.$apply('foo = "abcde"');
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).text()).toBe('5 / 5');
pageScope.$apply('foo = "abcdef"');
el.find('input').triggerHandler('input');
expect(pageScope.form.foo.$error['md-maxlength']).toBe(true);
expect(getCharCounter(el).text()).toBe('6 / 5');
pageScope.$apply('foo = "abc"');
el.find('input').triggerHandler('input');
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).text()).toBe('3 / 5');
});
it('should render correct character count when value is a number', function() {
var template =
'<md-input-container>' +
' <input ng-model="item.numberValue" md-maxlength="6">' +
'</md-input-container>';
var element = $compile(template)(pageScope);
pageScope.$apply();
// Flush any pending $mdUtil.nextTick calls
$timeout.flush();
pageScope.item = {numberValue: 456};
pageScope.$apply();
expect(getCharCounter(element).text()).toBe('3 / 6');
});
it('should update correctly the counter, when deleting the model value', function() {
var el = $compile(
'<form name="form">' +
'<md-input-container>' +
'<input md-maxlength="5" ng-model="foo" name="foo">' +
'</md-input-container>' +
'</form>'
)(pageScope);
pageScope.$apply();
// Flush any pending $mdUtil.nextTick calls
$timeout.flush();
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).text()).toBe('0 / 5');
pageScope.$apply('foo = "abcdef"');
expect(pageScope.form.foo.$error['md-maxlength']).toBe(true);
expect(getCharCounter(el).text()).toBe('6 / 5');
pageScope.$apply('foo = ""');
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).text()).toBe('0 / 5');
});
it('should add and remove maxlength element & error with expression', function() {
var el = $compile(
'<form name="form">' +
' <md-input-container>' +
' <input md-maxlength="max" ng-model="foo" name="foo">' +
' </md-input-container>' +
'</form>')(pageScope);
pageScope.$apply();
// Flush any pending $mdUtil.nextTick calls
$timeout.flush();
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).length).toBe(0);
pageScope.$apply('max = 5');
pageScope.$apply('foo = "abcdef"');
expect(pageScope.form.foo.$error['md-maxlength']).toBeTruthy();
expect(getCharCounter(el).length).toBe(1);
expect(getCharCounter(el).text()).toBe('6 / 5');
pageScope.$apply('max = -1');
pageScope.$apply('foo = "abcdefg"');
expect(pageScope.form.foo.$error['md-maxlength']).toBeFalsy();
expect(getCharCounter(el).length).toBe(0);
});
});
it('should not add the md-input-has-placeholder class when the placeholder is transformed into a label', inject(function($rootScope, $compile) {
var el = $compile(
'<md-input-container><input ng-model="foo" placeholder="some placeholder"></md-input-container>'
)($rootScope);
expect(el.hasClass('md-input-has-placeholder')).toBe(false);
}));
it('should add the md-input-has-placeholder class when both the placeholder and label are provided', inject(function($rootScope, $compile) {
var el = $compile(
'<md-input-container>' +
' <label>Hello</label>' +
' <input ng-model="foo" placeholder="some placeholder" />' +
'</md-input-container>'
)($rootScope);
expect(el.hasClass('md-input-has-placeholder')).toBe(true);
}));
it('should put placeholder into a label element', function() {
var el = $compile('<md-input-container><input ng-model="foo" placeholder="some placeholder"></md-input-container>')(pageScope);
var placeholder = el[0].querySelector('.md-placeholder');
var label = el.find('label')[0];
expect(el.find('input')[0].hasAttribute('placeholder')).toBe(false);
expect(label).toBeTruthy();
expect(label.textContent).toEqual('some placeholder');
});
it('should not create a floating label from a placeholder if md-no-float is empty', function() {
var el = compile(
'<md-input-container md-no-float>' +
' <input placeholder="Foo" ng-model="foo">' +
'</md-input-container>'
);
expect(el.find('label').length).toBe(0);
});
it('should not create a floating label from a placeholder if md-no-float is truthy', function() {
pageScope.inputs = [{
placeholder: 'Name',
model: ''
}, {
placeholder: 'Email',
model: ''
}];
var el = compile(
'<div>' +
' <md-input-container ng-repeat="input in inputs" md-no-float="$index !== 0">' +
' <input placeholder="{{input.placeholder}}" ng-model="input.model">' +
' </md-input-container>' +
'</div>'
);
var labels = el.find('label');
expect(labels.length).toBe(1);
expect(labels[0].textContent).toEqual('Name');
});
it('should create a floating label from a placeholder if md-no-float is falsey', function() {
var el = compile(
'<md-input-container md-no-float="false">' +
' <input placeholder="Foo" ng-model="foo">' +
'</md-input-container>'
);
expect(el.find('label').length).toBe(1);
});
it('should ignore placeholder when a label element is present', function() {
var el = $compile(
'<md-input-container>' +
' <label>Hello</label>' +
' <input ng-model="foo" placeholder="some placeholder" />' +
'</md-input-container>'
)(pageScope);
var label = el.find('label')[0];
expect(el.find('input')[0].hasAttribute('placeholder')).toBe(true);
expect(label).toBeTruthy();
expect(label.textContent).toEqual('Hello');
});
it('should transfer the placeholder data binding to the newly-created label', function() {
var el = $compile(
'<md-input-container>' +
' <input ng-model="foo" placeholder="{{placeholder}}" />' +
'</md-input-container>'
)(pageScope);
var label = el[0].querySelector('label');
var input = el[0].querySelector('input');
pageScope.placeholder = 'foo';
pageScope.$digest();
expect(label).toBeTruthy();
expect(input.hasAttribute('placeholder')).toBe(false);
expect(label.textContent).toEqual('foo');
pageScope.placeholder = 'bar';
pageScope.$digest();
// We should check again to make sure that Angular didn't
// re-add the placeholder attribute and cause double labels.
expect(input.hasAttribute('placeholder')).toBe(false);
expect(label.textContent).toEqual('bar');
});
it('should put an aria-label on the input when no label is present', inject(function($timeout) {
var el = $compile(
'<form name="form">' +
' <md-input-container md-no-float>' +
' <input placeholder="baz" ng-model="foo" name="foo">' +
' </md-input-container>' +
'</form>')(pageScope);
// Flushes the $mdUtil.nextTick
$timeout.flush();
var input = el.find('input');
expect(input.attr('aria-label')).toBe('baz');
}));
it('should evaluate the placeholder expression before setting the aria-label', function() {
pageScope.placeholder = 'baz';
var el = $compile(
'<form name="form">' +
' <md-input-container md-no-float>' +
' <input placeholder="{{placeholder}}" ng-model="foo" name="foo">' +
' </md-input-container>' +
'</form>')(pageScope);
expect(el.find('input').attr('aria-label')).toBe('baz');
});
it('should put the container in "has value" state when input has a static value', function() {
var scope = pageScope.$new();
var template =
'<md-input-container>' +
' <label>Name</label>' +
' <input value="Larry">' +
'</md-input-container>';
var element = $compile(template)(scope);
scope.$apply();
expect(element.hasClass('md-input-has-value')).toBe(true);
});
it('adds the md-auto-hide class to messages without a visiblity directive', function() {
var el = compile(
'<md-input-container><input ng-model="foo">' +
' <div ng-messages></div>' +
'</md-input-container>'
);
expect(el[0].querySelector("[ng-messages]").classList.contains('md-auto-hide')).toBe(true);
});
it('does not add the md-auto-hide class with md-auto-hide="false" on the messages', function() {
var el = compile(
'<md-input-container><input ng-model="foo">' +
' <div ng-messages md-auto-hide="false">Test Message</div>' +
'</md-input-container>'
);
expect(el[0].querySelector("[ng-messages]").classList.contains('md-auto-hide')).toBe(false);
});
describe('with ng-messages', function() {
it('adds the md-auto-hide class to messages without a visiblity directive', inject(function() {
var el = compile(
'<md-input-container><input ng-model="foo">' +
' <div ng-messages></div>' +
'</md-input-container>'
);
expect(el[0].querySelector("[ng-messages]").classList.contains('md-auto-hide')).toBe(true);
}));
it('does not add the md-auto-hide class with md-auto-hide="false" on the messages', inject(function() {
var el = compile(
'<md-input-container><input ng-model="foo">' +
' <div ng-messages md-auto-hide="false">Test Message</div>' +
'</md-input-container>'
);
expect(el[0].querySelector("[ng-messages]").classList.contains('md-auto-hide')).toBe(false);
}));
var visibilityDirectives = ['ng-if', 'ng-show', 'ng-hide'];
visibilityDirectives.forEach(function(vdir) {
it('does not add the md-auto-hide class with ' + vdir + ' on the messages', inject(function() {
var el = compile(
'<md-input-container><input ng-model="foo">' +
' <div ng-messages ' + vdir + '="true">Test Message</div>' +
'</md-input-container>'
);
expect(el[0].querySelector("[ng-messages]").classList.contains('md-auto-hide')).toBe(false);
}));
});
it('does not add the md-auto-hide class with ngSwitch on the messages', inject(function() {
pageScope.switchVal = 1;
var el = compile(
'<md-input-container ng-switch="switchVal">' +
' <input ng-model="foo">' +
' <div ng-messages ng-switch-when="1">1</div>' +
' <div ng-messages ng-switch-when="2">2</div>' +
' <div ng-messages ng-switch-default>Other</div>' +
'</md-input-container>'
);
expect(el[0].querySelector("[ng-messages]").classList.contains('md-auto-hide')).toBe(false);
}));
it('should set the animation class on the ngMessage properly', inject(function() {
var element = compile(
'<form name="myForm">' +
' <md-input-container>' +
' <input ng-model="inputVal" name="myModel" required>' +
' <div ng-messages="myForm.myModel.$error">' +
' <ng-message id="requiredMessage" when="required">Field required</ng-message>' +
' </div>' +
' </md-input-container>' +
'</form>'
);
var ngMessage = element.find('ng-message');
expect(ngMessage).toHaveClass('md-input-message-animation');
}));
// NOTE: I believe this test was erroneously passing since we did not properly include the
// ngMessages module. After properly including this test now fails, so I have disabled it
// until we can figure out if this is a valid test. - Topher - 7/26/2016
xit('should set the animation class on a transcluded ngMessage', function() {
// We can emulate the transclusion, by wrapping the ngMessage inside of a document fragment.
// It is not necessary to add a *extra* component / directive for that, since we just
// want to the test the DocumentFragment detection.
var fragment = document.createDocumentFragment();
var inputContainer = compile(
'<md-input-container>' +
' <input ng-model="inputVal">' +
' <div ng-messages id="messageInsertion">' +
' </div>' +
'</md-input-container>'
);
// We build our element, without compiling and linking it.
// Because we invoke those steps manually during the tests.
var messageElement = angular.element(
'<ng-message id="requiredMessage" when="required">Field Required</ng-message>'
);
fragment.appendChild(messageElement[0]);
// Only compile the element at this time, and link it to its scope later.
// Normally the directive will add the animation class upon compile.
var linkFn = $compile(messageElement);
expect(messageElement).not.toHaveClass('md-input-message-animation');
// Now we emulate the finish of the transclusion.
// We move the element from the fragment into the correct input
// container.
inputContainer[0].appendChild(messageElement[0]);
// Manually invoke the postLink function of the directive.
linkFn($rootScope.$new());
expect(messageElement).toHaveClass('md-input-message-animation');
});
it('should select the input value on focus', inject(function($timeout) {
var input = $compile('<input md-select-on-focus value="Text">')($rootScope);
document.body.appendChild(input[0]);
expect(isTextSelected(input[0])).toBe(false);
input.focus();
input.triggerHandler('focus');
$timeout.flush();
expect(isTextSelected(input[0])).toBe(true);
input.remove();
function isTextSelected(input) {
if (typeof input.selectionStart === "number") {
return input.selectionStart === 0 && input.selectionEnd === input.value.length;
} else if (typeof document.selection !== "undefined") {
return document.selection.createRange().text === input.value;
}
}
}));
describe('Textarea auto-sizing', function() {
var ngElement, element, ngTextarea, textarea, scope, parentElement;
function createAndAppendElement(attrs) {
scope = $rootScope.$new();
attrs = attrs || '';
var template =
'<div ng-hide="parentHidden">' +
' <md-input-container>' +
' <label>Biography</label>' +
' <textarea ' + attrs + '>Single line</textarea>' +
' </md-input-container>' +
'</div>';
parentElement = $compile(template)(scope);
ngElement = parentElement.find('md-input-container');
element = ngElement[0];
ngTextarea = ngElement.find('textarea');
textarea = ngTextarea[0];
document.body.appendChild(parentElement[0]);
}
afterEach(function() {
document.body.removeChild(parentElement[0]);
});
it('should auto-size the textarea as the user types', function() {
createAndAppendElement();
var oldHeight = textarea.offsetHeight;
ngTextarea.val('Multiple\nlines\nof\ntext');
ngTextarea.triggerHandler('input');
expect(textarea.offsetHeight).toBeGreaterThan(oldHeight);
});
it('should auto-size the textarea in response to an outside ngModel change', function() {
createAndAppendElement('ng-model="model"');
var oldHeight = textarea.offsetHeight;
scope.model = '1\n2\n3\n';
$timeout.flush();
expect(textarea.offsetHeight).toBeGreaterThan(oldHeight);
});
it('should allow the textarea to shrink if text is being deleted', function() {
createAndAppendElement();
ngTextarea.val('Multiple\nlines\nof\ntext');
ngTextarea.triggerHandler('input');
var oldHeight = textarea.offsetHeight;
ngTextarea.val('One line of text');
ngTextarea.triggerHandler('input');
expect(textarea.offsetHeight).toBeLessThan(oldHeight);
});
it('should not auto-size if md-no-autogrow is present', function() {
createAndAppendElement('md-no-autogrow');
var oldHeight = textarea.offsetHeight;
ngTextarea.val('Multiple\nlines\nof\ntext');
ngTextarea.triggerHandler('input');
var newHeight = textarea.offsetHeight;
expect(newHeight).toEqual(oldHeight);
});
it('should auto-size when revealed if md-detect-hidden is present', function() {
createAndAppendElement('md-detect-hidden');
var oldHeight = textarea.offsetHeight;
scope.parentHidden = true;
ngTextarea.val('Multiple\nlines\nof\ntext');
ngTextarea.triggerHandler('input');
scope.$apply();
// Textarea should still be hidden.
expect(textarea.offsetHeight).toBe(0);
scope.parentHidden = false;
scope.$apply();
var newHeight = textarea.offsetHeight;
expect(textarea.offsetHeight).toBeGreaterThan(oldHeight);
});
it('should set the rows attribute as the user types', function() {
createAndAppendElement();
expect(textarea.rows).toBe(1);
ngTextarea.val('1\n2\n3');
ngTextarea.triggerHandler('input');
expect(textarea.rows).toBe(3);
});
it('should not allow the textarea rows to be less than the minimum number of rows', function() {
createAndAppendElement('rows="5"');
ngTextarea.val('1\n2\n3\n4\n5\n6\n7');
ngTextarea.triggerHandler('input');
expect(textarea.rows).toBe(7);
ngTextarea.val('');
ngTextarea.triggerHandler('input');
expect(textarea.rows).toBe(5);
});
it('should not let a textarea grow past its maximum number of rows', function() {
createAndAppendElement('max-rows="5"');
ngTextarea.val('1\n2\n3');
ngTextarea.triggerHandler('input');
expect(textarea.rows).toBe(3);
expect(ngTextarea.attr('md-no-autogrow')).toBeUndefined();
ngTextarea.val('1\n2\n3\n4\n5\n6\n7\n8\n9');
ngTextarea.triggerHandler('input');
expect(textarea.rows).toBe(5);
expect(ngTextarea.attr('md-no-autogrow')).toBeDefined();
});
it('should add a handle for resizing the textarea', function() {
createAndAppendElement();
expect(element.querySelector('.md-resize-handle')).toBeTruthy();
});
it('should disable auto-sizing if the handle gets dragged', function() {
createAndAppendElement();
var handle = angular.element(element.querySelector('.md-resize-handle'));
ngTextarea.val('1\n2\n3');
ngTextarea.triggerHandler('input');
var oldHeight = textarea.offsetHeight;
handle.triggerHandler('mousedown');
ngElement.triggerHandler('$md.dragstart');
ngTextarea.val('1\n2\n3\n4\n5\n6');
ngTextarea.triggerHandler('input');
expect(textarea.offsetHeight).toBe(oldHeight);
});
it('should not add the handle if md-no-resize is present', function() {
createAndAppendElement('md-no-resize');
expect(element.querySelector('.md-resize-handle')).toBeFalsy();
});
it('should reset the padding after measuring the line height', function() {
createAndAppendElement();
ngTextarea.triggerHandler('input');
expect(textarea.style.padding).toBeFalsy();
});
it('should preserve the original inline padding', function() {
createAndAppendElement('style="padding: 10px;"');
ngTextarea.triggerHandler('input');
expect(textarea.style.padding).toBe('10px');
});
});
describe('icons', function() {
it('should add md-icon-left class when md-icon is before the input', function() {
var el = compile(
'<md-input-container>' +
' <md-icon></md-icon>' +
' <input ng-model="foo">' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-left')).toBeTruthy();
});
it('should add md-icon-left class when .md-icon is before the input', function() {
var el = compile(
'<md-input-container>' +
' <i class="md-icon"></i>' +
' <input ng-model="foo">' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-left')).toBeTruthy();
});
it('should add md-icon-right class when md-icon is after the input', function() {
var el = compile(
'<md-input-container>' +
' <input ng-model="foo">' +
' <md-icon></md-icon>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-right')).toBeTruthy();
});
it('should add md-icon-right class when .md-icon is after the input', function() {
var el = compile(
'<md-input-container>' +
' <input ng-model="foo">' +
' <i class="md-icon"></i>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-right')).toBeTruthy();
});
it('should add md-icon-left and md-icon-right classes when md-icons are before and after the input', function() {
var el = compile(
'<md-input-container>' +
' <md-icon></md-icon>' +
' <input ng-model="foo">' +
' <md-icon></md-icon>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-left md-icon-right')).toBeTruthy();
});
it('should add md-icon-left and md-icon-right classes when .md-icons are before and after the input', function() {
var el = compile(
'<md-input-container>' +
' <i class="md-icon"></i>' +
' <input ng-model="foo">' +
' <i class="md-icon"></i>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-left md-icon-right')).toBeTruthy();
});
it('should add md-icon-left class when md-icon is before select', function() {
var el = compile(
'<md-input-container>' +
' <md-icon></md-icon>' +
' <md-select ng-model="foo"></md-select>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-left')).toBeTruthy();
});
it('should add md-icon-right class when md-icon is before select', function() {
var el = compile(
'<md-input-container>' +
' <md-select ng-model="foo"></md-select>' +
' <md-icon></md-icon>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-right')).toBeTruthy();
});
it('should add md-icon-left class when md-icon is before textarea', function() {
var el = compile(
'<md-input-container>' +
' <md-icon></md-icon>' +
' <textarea ng-model="foo"></textarea>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-left')).toBeTruthy();
});
it('should add md-icon-right class when md-icon is before textarea', function() {
var el = compile(
'<md-input-container>' +
' <textarea ng-model="foo"></textarea>' +
' <md-icon></md-icon>' +
'</md-input-container>'
);
expect(el.hasClass('md-icon-right')).toBeTruthy();
});
});
});
});