diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index 408160521271..93211f96dd84 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -24,7 +24,9 @@ var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+- // 9. Fragment // 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999 var URL_REGEXP = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i; -var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; +/* jshint maxlen:220 */ +var EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/; +/* jshint maxlen:200 */ var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; var DATE_REGEXP = /^(\d{4,})-(\d{2})-(\d{2})$/; var DATETIMELOCAL_REGEXP = /^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js index db53047ec6cc..736d9b268165 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -2784,14 +2784,103 @@ describe('input', function() { describe('EMAIL_REGEXP', function() { /* global EMAIL_REGEXP: false */ it('should validate email', function() { + /* basic functionality */ expect(EMAIL_REGEXP.test('a@b.com')).toBe(true); expect(EMAIL_REGEXP.test('a@b.museum')).toBe(true); expect(EMAIL_REGEXP.test('a@B.c')).toBe(true); + /* domain label separation, hyphen-minus, syntax */ + expect(EMAIL_REGEXP.test('a@b.c.')).toBe(false); expect(EMAIL_REGEXP.test('a@.b.c')).toBe(false); expect(EMAIL_REGEXP.test('a@-b.c')).toBe(false); expect(EMAIL_REGEXP.test('a@b-.c')).toBe(false); + expect(EMAIL_REGEXP.test('a@b-c')).toBe(true); + expect(EMAIL_REGEXP.test('a@-')).toBe(false); + expect(EMAIL_REGEXP.test('a@.')).toBe(false); + expect(EMAIL_REGEXP.test('a@host_name')).toBe(false); + /* leading or sole digit */ expect(EMAIL_REGEXP.test('a@3b.c')).toBe(true); + expect(EMAIL_REGEXP.test('a@3')).toBe(true); + /* TLD eMail address */ expect(EMAIL_REGEXP.test('a@b')).toBe(true); + /* domain valid characters */ + expect(EMAIL_REGEXP.test('a@abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789')).toBe(true); + /* domain invalid characters */ + expect(EMAIL_REGEXP.test('a@')).toBe(false); + expect(EMAIL_REGEXP.test('a@ ')).toBe(false); + expect(EMAIL_REGEXP.test('a@!')).toBe(false); + expect(EMAIL_REGEXP.test('a@"')).toBe(false); + expect(EMAIL_REGEXP.test('a@#')).toBe(false); + expect(EMAIL_REGEXP.test('a@$')).toBe(false); + expect(EMAIL_REGEXP.test('a@%')).toBe(false); + expect(EMAIL_REGEXP.test('a@&')).toBe(false); + expect(EMAIL_REGEXP.test("a@'")).toBe(false); + expect(EMAIL_REGEXP.test('a@(')).toBe(false); + expect(EMAIL_REGEXP.test('a@)')).toBe(false); + expect(EMAIL_REGEXP.test('a@*')).toBe(false); + expect(EMAIL_REGEXP.test('a@+')).toBe(false); + expect(EMAIL_REGEXP.test('a@,')).toBe(false); + expect(EMAIL_REGEXP.test('a@/')).toBe(false); + expect(EMAIL_REGEXP.test('a@:')).toBe(false); + expect(EMAIL_REGEXP.test('a@;')).toBe(false); + expect(EMAIL_REGEXP.test('a@<')).toBe(false); + expect(EMAIL_REGEXP.test('a@=')).toBe(false); + expect(EMAIL_REGEXP.test('a@>')).toBe(false); + expect(EMAIL_REGEXP.test('a@?')).toBe(false); + expect(EMAIL_REGEXP.test('a@@')).toBe(false); + expect(EMAIL_REGEXP.test('a@[')).toBe(false); + expect(EMAIL_REGEXP.test('a@\\')).toBe(false); + expect(EMAIL_REGEXP.test('a@]')).toBe(false); + expect(EMAIL_REGEXP.test('a@^')).toBe(false); + expect(EMAIL_REGEXP.test('a@_')).toBe(false); + expect(EMAIL_REGEXP.test('a@`')).toBe(false); + expect(EMAIL_REGEXP.test('a@{')).toBe(false); + expect(EMAIL_REGEXP.test('a@|')).toBe(false); + expect(EMAIL_REGEXP.test('a@}')).toBe(false); + expect(EMAIL_REGEXP.test('a@~')).toBe(false); + expect(EMAIL_REGEXP.test('a@İ')).toBe(false); + expect(EMAIL_REGEXP.test('a@ı')).toBe(false); + /* domain length, label and total */ + expect(EMAIL_REGEXP.test('a@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')).toBe(true); + expect(EMAIL_REGEXP.test('a@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')).toBe(false); + /* jshint maxlen:320 */ + expect(EMAIL_REGEXP.test('a@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')).toBe(true); + expect(EMAIL_REGEXP.test('a@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.x')).toBe(true); + expect(EMAIL_REGEXP.test('a@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xx')).toBe(false); + expect(EMAIL_REGEXP.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xx')).toBe(true); + expect(EMAIL_REGEXP.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxx')).toBe(false); + /* jshint maxlen:200 */ + /* local-part valid characters and dot-atom syntax */ + expect(EMAIL_REGEXP.test("'@x")).toBe(true); + expect(EMAIL_REGEXP.test('-!#$%&*+/0123456789=?ABCDEFGHIJKLMNOPQRSTUVWXYZ@x')).toBe(true); + expect(EMAIL_REGEXP.test('^_`abcdefghijklmnopqrstuvwxyz{|}~@x')).toBe(true); + expect(EMAIL_REGEXP.test(".@x")).toBe(false); + expect(EMAIL_REGEXP.test("'.@x")).toBe(false); + expect(EMAIL_REGEXP.test(".'@x")).toBe(false); + expect(EMAIL_REGEXP.test("'.'@x")).toBe(true); + /* local-part invalid characters */ + expect(EMAIL_REGEXP.test('@x')).toBe(false); + expect(EMAIL_REGEXP.test(' @x')).toBe(false); + expect(EMAIL_REGEXP.test('"@x')).toBe(false); + expect(EMAIL_REGEXP.test('(@x')).toBe(false); + expect(EMAIL_REGEXP.test(')@x')).toBe(false); + expect(EMAIL_REGEXP.test(',@x')).toBe(false); + expect(EMAIL_REGEXP.test(':@x')).toBe(false); + expect(EMAIL_REGEXP.test(';@x')).toBe(false); + expect(EMAIL_REGEXP.test('<@x')).toBe(false); + expect(EMAIL_REGEXP.test('>@x')).toBe(false); + expect(EMAIL_REGEXP.test('@@x')).toBe(false); + expect(EMAIL_REGEXP.test('[@x')).toBe(false); + expect(EMAIL_REGEXP.test('\\@x')).toBe(false); + expect(EMAIL_REGEXP.test(']@x')).toBe(false); + expect(EMAIL_REGEXP.test('İ@x')).toBe(false); + expect(EMAIL_REGEXP.test('ı@x')).toBe(false); + /* local-part size limit */ + expect(EMAIL_REGEXP.test('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@x')).toBe(true); + expect(EMAIL_REGEXP.test('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@x')).toBe(false); + /* content (local-part + ‘@’ + domain) is required */ + expect(EMAIL_REGEXP.test('')).toBe(false); + expect(EMAIL_REGEXP.test('a')).toBe(false); + expect(EMAIL_REGEXP.test('aa')).toBe(false); }); }); });