+       Snippet: 
+       
+         
+           | Filter+ | Source+ | Rendered+ | 
+         
+           | linky filter+ | + +<div ng:bind="snippet | linky">+</div>
 | +             
++ | 
+         
+           | no filter+ | +<div ng:bind="snippet"></div>
 | + | 
+       
+     
+     
+       it('should linkify the snippet with urls', function() {
+         expect(using('#linky-filter').binding('snippet | linky')).
+           toBe('Pretty text with some links:\n' +
+                'http://angularjs.org/,\n' +
+                'us@somewhere.org,\n' +
+                'another@somewhere.org,\n' +
+                'and one more: ftp://127.0.0.1/.');
+       });
+
+       it ('should not linkify snippet without the linky filter', function() {
+         expect(using('#escaped-html').binding('snippet')).
+           toBe("Pretty text with some links:\n" +
+                "http://angularjs.org/,\n" +
+                "mailto:us@somewhere.org,\n" +
+                "another@somewhere.org,\n" +
+                "and one more: ftp://127.0.0.1/.");
+       });
+
+       it('should update', function() {
+         input('snippet').enter('new http://link.');
+         expect(using('#linky-filter').binding('snippet | linky')).
+           toBe('new http://link.');
+         expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');
+       });
+     
+   
+ */
+var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,
+    MAILTO_REGEXP = /^mailto:/;
+
+angularFilter.linky = function(text) {
+  if (!text) return text;
+  var match;
+  var raw = text;
+  var html = [];
+  var writer = htmlSanitizeWriter(html);
+  var url;
+  var i;
+  while ((match = raw.match(LINKY_URL_REGEXP))) {
+    // We can not end in these as they are sometimes found at the end of the sentence
+    url = match[0];
+    // if we did not match ftp/http/mailto then assume mailto
+    if (match[2] == match[3]) url = 'mailto:' + url;
+    i = match.index;
+    writer.chars(raw.substr(0, i));
+    writer.start('a', {href:url});
+    writer.chars(match[0].replace(MAILTO_REGEXP, ''));
+    writer.end('a');
+    raw = raw.substring(i + match[0].length);
+  }
+  writer.chars(raw);
+  return new HTML(html.join(''));
+};
diff --git a/test/FiltersSpec.js b/test/FiltersSpec.js
deleted file mode 100644
index 8c567441..00000000
--- a/test/FiltersSpec.js
+++ /dev/null
@@ -1,300 +0,0 @@
-'use strict';
-
-describe('filter', function() {
-
-  var filter = angular.filter;
-
-  it('should called the filter when evaluating expression', inject(function($rootScope) {
-    filter.fakeFilter = function() {};
-    spyOn(filter, 'fakeFilter');
-
-    $rootScope.$eval('10|fakeFilter');
-    expect(filter.fakeFilter).toHaveBeenCalledWith(10);
-    delete filter['fakeFilter'];
-  }));
-
-  it('should call filter on scope context', inject(function($rootScope) {
-    $rootScope.name = 'misko';
-    filter.fakeFilter = function() {
-      expect(this.name).toEqual('misko');
-    };
-    spyOn(filter, 'fakeFilter').andCallThrough();
-
-    $rootScope.$eval('10|fakeFilter');
-    expect(filter.fakeFilter).toHaveBeenCalled();
-    delete filter['fakeFilter'];
-  }));
-
-  describe('formatNumber', function() {
-    var pattern;
-
-    beforeEach(function() {
-      pattern = { minInt: 1,
-                  minFrac: 0,
-                  maxFrac: 3,
-                  posPre: '',
-                  posSuf: '',
-                  negPre: '-',
-                  negSuf: '',
-                  gSize: 3,
-                  lgSize: 3 };
-    });
-
-    it('should format according to different patterns', function() {
-      pattern.gSize = 2;
-      var num = formatNumber(1234567.89, pattern, ',', '.');
-      expect(num).toBe('12,34,567.89');
-      num = formatNumber(1234.56, pattern, ',', '.');
-      expect(num).toBe('1,234.56');
-
-      pattern.negPre = '(';
-      pattern.negSuf = '-)';
-      num = formatNumber(-1234, pattern, ',', '.');
-      expect(num).toBe('(1,234-)');
-      pattern.posPre = '+';
-      pattern.posSuf = '+';
-      num = formatNumber(1234, pattern, ',', '.');
-      expect(num).toBe('+1,234+');
-      pattern.posPre = pattern.posSuf = '';
-
-      pattern.minFrac = 2;
-      num = formatNumber(1, pattern, ',', '.');
-      expect(num).toBe('1.00');
-      pattern.maxFrac = 4;
-      num = formatNumber(1.11119, pattern, ',', '.');
-      expect(num).toBe('1.1112');
-    });
-
-    it('should format according different seperators', function() {
-      var num = formatNumber(1234567.1, pattern, '.', ',', 2);
-      expect(num).toBe('1.234.567,10');
-    });
-
-    it('should format with or without fractionSize', function() {
-      var num = formatNumber(123.1, pattern, ',', '.', 3);
-      expect(num).toBe('123.100');
-      num = formatNumber(123.12, pattern, ',', '.');
-      expect(num).toBe('123.12');
-      var num = formatNumber(123.1116, pattern, ',', '.');
-      expect(num).toBe('123.112');
-    });
-  });
-
-  describe('currency', function() {
-    var currency, html, context;
-
-    beforeEach(inject(function($rootScope) {
-      html = jqLite('
');
-      context = $rootScope;
-      context.$element = html;
-      currency = bind(context, filter.currency);
-    }));
-
-    it('should do basic currency filtering', function() {
-      expect(currency(0)).toEqual('$0.00');
-      expect(html.hasClass('ng-format-negative')).toBeFalsy();
-      expect(currency(-999)).toEqual('($999.00)');
-      expect(html.hasClass('ng-format-negative')).toBeTruthy();
-      expect(currency(1234.5678, "USD$")).toEqual('USD$1,234.57');
-      expect(html.hasClass('ng-format-negative')).toBeFalsy();
-    });
-
-
-    it('should return empty string for non-numbers', function() {
-      expect(currency()).toBe('');
-      expect(html.hasClass('ng-format-negative')).toBeFalsy();
-      expect(currency('abc')).toBe('');
-      expect(html.hasClass('ng-format-negative')).toBeFalsy();
-    });
-  });
-
-
-  describe('number', function() {
-    var context, number;
-
-    beforeEach(inject(function($rootScope) {
-      context = $rootScope;
-      number = bind(context, filter.number);
-    }));
-
-
-    it('should do basic filter', function() {
-      expect(number(0, 0)).toEqual('0');
-      expect(number(-999)).toEqual('-999');
-      expect(number(123)).toEqual('123');
-      expect(number(1234567)).toEqual('1,234,567');
-      expect(number(1234)).toEqual('1,234');
-      expect(number(1234.5678)).toEqual('1,234.568');
-      expect(number(Number.NaN)).toEqual('');
-      expect(number("1234.5678")).toEqual('1,234.568');
-      expect(number(1/0)).toEqual("");
-      expect(number(1,        2)).toEqual("1.00");
-      expect(number(.1,       2)).toEqual("0.10");
-      expect(number(.01,      2)).toEqual("0.01");
-      expect(number(.001,     3)).toEqual("0.001");
-      expect(number(.0001,    3)).toEqual("0.000");
-      expect(number(9,        2)).toEqual("9.00");
-      expect(number(.9,       2)).toEqual("0.90");
-      expect(number(.99,      2)).toEqual("0.99");
-      expect(number(.999,     3)).toEqual("0.999");
-      expect(number(.9999,    3)).toEqual("1.000");
-      expect(number(1234.567, 0)).toEqual("1,235");
-      expect(number(1234.567, 1)).toEqual("1,234.6");
-      expect(number(1234.567, 2)).toEqual("1,234.57");
-    });
-
-    it('should filter exponential numbers', function() {
-      expect(number(1e50, 0)).toEqual('1e+50');
-      expect(number(-2e50, 2)).toEqual('-2e+50');
-    });
-  });
-
-  describe('json', function () {
-    it('should do basic filter', function() {
-      expect(filter.json.call({$element:jqLite('
')}, {a:"b"})).toEqual(toJson({a:"b"}, true));
-    });
-  });
-
-  describe('lowercase', function() {
-    it('should do basic filter', function() {
-      expect(filter.lowercase('AbC')).toEqual('abc');
-      expect(filter.lowercase(null)).toBeNull();
-    });
-  });
-
-  describe('uppercase', function() {
-    it('should do basic filter', function() {
-      expect(filter.uppercase('AbC')).toEqual('ABC');
-      expect(filter.uppercase(null)).toBeNull();
-    });
-  });
-
-  describe('html', function() {
-    it('should do basic filter', function() {
-      var html = filter.html("a
cd");
-      expect(html instanceof HTML).toBeTruthy();
-      expect(html.html).toEqual("a
cd");
-    });
-  });
-
-  describe('linky', function() {
-    var linky = filter.linky;
-    it('should do basic filter', function() {
-      expect(linky("http://ab/ (http://a/) 
 http://1.2/v:~-123. c").html).
-        toEqual('
http://ab/ ' +
-                '(
http://a/) ' +
-                '<
http://a/> ' +
-                '
http://1.2/v:~-123. c');
-      expect(linky(undefined)).not.toBeDefined();
-    });
-
-    it('should handle mailto:', function() {
-      expect(linky("mailto:me@example.com").html).
-                      toEqual('
me@example.com');
-      expect(linky("me@example.com").html).
-                      toEqual('
me@example.com');
-      expect(linky("send email to me@example.com, but").html).
-        toEqual('send email to 
me@example.com, but');
-    });
-  });
-
-  describe('date', function() {
-
-    var morning  = new angular.mock.TzDate(+5, '2010-09-03T12:05:08.000Z'); //7am
-    var noon =     new angular.mock.TzDate(+5, '2010-09-03T17:05:08.000Z'); //12pm
-    var midnight = new angular.mock.TzDate(+5, '2010-09-03T05:05:08.000Z'); //12am
-    var earlyDate = new angular.mock.TzDate(+5, '0001-09-03T05:05:08.000Z');
-
-    var context, date;
-
-    beforeEach(inject(function($rootScope) {
-      context = $rootScope;
-      date = bind(context, filter.date);
-    }));
-
-    it('should ignore falsy inputs', function() {
-      expect(date(null)).toBeNull();
-      expect(date('')).toEqual('');
-    });
-
-    it('should do basic filter', function() {
-      expect(date(noon)).toEqual(date(noon, 'mediumDate'));
-      expect(date(noon, '')).toEqual(date(noon, 'mediumDate'));
-    });
-
-    it('should accept number or number string representing milliseconds as input', function() {
-      expect(date(noon.getTime())).toEqual(date(noon.getTime(), 'mediumDate'));
-      expect(date(noon.getTime() + "")).toEqual(date(noon.getTime() + "", 'mediumDate'));
-    });
-
-    it('should accept various format strings', function() {
-      expect(date(morning, "yy-MM-dd HH:mm:ss")).
-                      toEqual('10-09-03 07:05:08');
-
-      expect(date(midnight, "yyyy-M-d h=H:m:saZ")).
-                      toEqual('2010-9-3 12=0:5:8AM0500');
-
-      expect(date(midnight, "yyyy-MM-dd hh=HH:mm:ssaZ")).
-                      toEqual('2010-09-03 12=00:05:08AM0500');
-
-      expect(date(noon, "yyyy-MM-dd hh=HH:mm:ssaZ")).
-                      toEqual('2010-09-03 12=12:05:08PM0500');
-
-      expect(date(noon, "EEE, MMM d, yyyy")).
-                      toEqual('Fri, Sep 3, 2010');
-
-      expect(date(noon, "EEEE, MMMM dd, yyyy")).
-                      toEqual('Friday, September 03, 2010');
-
-      expect(date(earlyDate, "MMMM dd, y")).
-                      toEqual('September 03, 1');
-    });
-
-    it('should treat single quoted strings as string literals', function() {
-      expect(date(midnight, "yyyy'de' 'a'x'dd' 'adZ' h=H:m:saZ")).
-                      toEqual('2010de axdd adZ 12=0:5:8AM0500');
-    });
-
-    it('should treat a sequence of two single quotes as a literal single quote', function() {
-      expect(date(midnight, "yyyy'de' 'a''dd' 'adZ' h=H:m:saZ")).
-                      toEqual("2010de a'dd adZ 12=0:5:8AM0500");
-    });
-
-    it('should accept default formats', function() {
-
-      expect(date(noon, "medium")).
-                      toEqual('Sep 3, 2010 12:05:08 PM');
-
-      expect(date(noon, "short")).
-                      toEqual('9/3/10 12:05 PM');
-
-      expect(date(noon, "fullDate")).
-                      toEqual('Friday, September 3, 2010');
-
-      expect(date(noon, "longDate")).
-                      toEqual('September 3, 2010');
-
-      expect(date(noon, "mediumDate")).
-                      toEqual('Sep 3, 2010');
-
-      expect(date(noon, "shortDate")).
-                      toEqual('9/3/10');
-
-      expect(date(noon, "mediumTime")).
-                      toEqual('12:05:08 PM');
-
-      expect(date(noon, "shortTime")).
-                      toEqual('12:05 PM');
-    });
-
-    it('should be able to parse ISO 8601 dates/times using', function() {
-      var isoString = '2010-09-03T05:05:08.872Z';
-      expect(date(isoString)).
-          toEqual(date(isoString, 'mediumDate'));
-    });
-
-    it('should parse format ending with non-replaced string', function() {
-      expect(date(morning, 'yy/xxx')).toEqual('10/xxx');
-    });
-  });
-});
diff --git a/test/service/filter/filtersSpec.js b/test/service/filter/filtersSpec.js
new file mode 100644
index 00000000..8c567441
--- /dev/null
+++ b/test/service/filter/filtersSpec.js
@@ -0,0 +1,300 @@
+'use strict';
+
+describe('filter', function() {
+
+  var filter = angular.filter;
+
+  it('should called the filter when evaluating expression', inject(function($rootScope) {
+    filter.fakeFilter = function() {};
+    spyOn(filter, 'fakeFilter');
+
+    $rootScope.$eval('10|fakeFilter');
+    expect(filter.fakeFilter).toHaveBeenCalledWith(10);
+    delete filter['fakeFilter'];
+  }));
+
+  it('should call filter on scope context', inject(function($rootScope) {
+    $rootScope.name = 'misko';
+    filter.fakeFilter = function() {
+      expect(this.name).toEqual('misko');
+    };
+    spyOn(filter, 'fakeFilter').andCallThrough();
+
+    $rootScope.$eval('10|fakeFilter');
+    expect(filter.fakeFilter).toHaveBeenCalled();
+    delete filter['fakeFilter'];
+  }));
+
+  describe('formatNumber', function() {
+    var pattern;
+
+    beforeEach(function() {
+      pattern = { minInt: 1,
+                  minFrac: 0,
+                  maxFrac: 3,
+                  posPre: '',
+                  posSuf: '',
+                  negPre: '-',
+                  negSuf: '',
+                  gSize: 3,
+                  lgSize: 3 };
+    });
+
+    it('should format according to different patterns', function() {
+      pattern.gSize = 2;
+      var num = formatNumber(1234567.89, pattern, ',', '.');
+      expect(num).toBe('12,34,567.89');
+      num = formatNumber(1234.56, pattern, ',', '.');
+      expect(num).toBe('1,234.56');
+
+      pattern.negPre = '(';
+      pattern.negSuf = '-)';
+      num = formatNumber(-1234, pattern, ',', '.');
+      expect(num).toBe('(1,234-)');
+      pattern.posPre = '+';
+      pattern.posSuf = '+';
+      num = formatNumber(1234, pattern, ',', '.');
+      expect(num).toBe('+1,234+');
+      pattern.posPre = pattern.posSuf = '';
+
+      pattern.minFrac = 2;
+      num = formatNumber(1, pattern, ',', '.');
+      expect(num).toBe('1.00');
+      pattern.maxFrac = 4;
+      num = formatNumber(1.11119, pattern, ',', '.');
+      expect(num).toBe('1.1112');
+    });
+
+    it('should format according different seperators', function() {
+      var num = formatNumber(1234567.1, pattern, '.', ',', 2);
+      expect(num).toBe('1.234.567,10');
+    });
+
+    it('should format with or without fractionSize', function() {
+      var num = formatNumber(123.1, pattern, ',', '.', 3);
+      expect(num).toBe('123.100');
+      num = formatNumber(123.12, pattern, ',', '.');
+      expect(num).toBe('123.12');
+      var num = formatNumber(123.1116, pattern, ',', '.');
+      expect(num).toBe('123.112');
+    });
+  });
+
+  describe('currency', function() {
+    var currency, html, context;
+
+    beforeEach(inject(function($rootScope) {
+      html = jqLite('
');
+      context = $rootScope;
+      context.$element = html;
+      currency = bind(context, filter.currency);
+    }));
+
+    it('should do basic currency filtering', function() {
+      expect(currency(0)).toEqual('$0.00');
+      expect(html.hasClass('ng-format-negative')).toBeFalsy();
+      expect(currency(-999)).toEqual('($999.00)');
+      expect(html.hasClass('ng-format-negative')).toBeTruthy();
+      expect(currency(1234.5678, "USD$")).toEqual('USD$1,234.57');
+      expect(html.hasClass('ng-format-negative')).toBeFalsy();
+    });
+
+
+    it('should return empty string for non-numbers', function() {
+      expect(currency()).toBe('');
+      expect(html.hasClass('ng-format-negative')).toBeFalsy();
+      expect(currency('abc')).toBe('');
+      expect(html.hasClass('ng-format-negative')).toBeFalsy();
+    });
+  });
+
+
+  describe('number', function() {
+    var context, number;
+
+    beforeEach(inject(function($rootScope) {
+      context = $rootScope;
+      number = bind(context, filter.number);
+    }));
+
+
+    it('should do basic filter', function() {
+      expect(number(0, 0)).toEqual('0');
+      expect(number(-999)).toEqual('-999');
+      expect(number(123)).toEqual('123');
+      expect(number(1234567)).toEqual('1,234,567');
+      expect(number(1234)).toEqual('1,234');
+      expect(number(1234.5678)).toEqual('1,234.568');
+      expect(number(Number.NaN)).toEqual('');
+      expect(number("1234.5678")).toEqual('1,234.568');
+      expect(number(1/0)).toEqual("");
+      expect(number(1,        2)).toEqual("1.00");
+      expect(number(.1,       2)).toEqual("0.10");
+      expect(number(.01,      2)).toEqual("0.01");
+      expect(number(.001,     3)).toEqual("0.001");
+      expect(number(.0001,    3)).toEqual("0.000");
+      expect(number(9,        2)).toEqual("9.00");
+      expect(number(.9,       2)).toEqual("0.90");
+      expect(number(.99,      2)).toEqual("0.99");
+      expect(number(.999,     3)).toEqual("0.999");
+      expect(number(.9999,    3)).toEqual("1.000");
+      expect(number(1234.567, 0)).toEqual("1,235");
+      expect(number(1234.567, 1)).toEqual("1,234.6");
+      expect(number(1234.567, 2)).toEqual("1,234.57");
+    });
+
+    it('should filter exponential numbers', function() {
+      expect(number(1e50, 0)).toEqual('1e+50');
+      expect(number(-2e50, 2)).toEqual('-2e+50');
+    });
+  });
+
+  describe('json', function () {
+    it('should do basic filter', function() {
+      expect(filter.json.call({$element:jqLite('
')}, {a:"b"})).toEqual(toJson({a:"b"}, true));
+    });
+  });
+
+  describe('lowercase', function() {
+    it('should do basic filter', function() {
+      expect(filter.lowercase('AbC')).toEqual('abc');
+      expect(filter.lowercase(null)).toBeNull();
+    });
+  });
+
+  describe('uppercase', function() {
+    it('should do basic filter', function() {
+      expect(filter.uppercase('AbC')).toEqual('ABC');
+      expect(filter.uppercase(null)).toBeNull();
+    });
+  });
+
+  describe('html', function() {
+    it('should do basic filter', function() {
+      var html = filter.html("a
cd");
+      expect(html instanceof HTML).toBeTruthy();
+      expect(html.html).toEqual("a
cd");
+    });
+  });
+
+  describe('linky', function() {
+    var linky = filter.linky;
+    it('should do basic filter', function() {
+      expect(linky("http://ab/ (http://a/) 
 http://1.2/v:~-123. c").html).
+        toEqual('
http://ab/ ' +
+                '(
http://a/) ' +
+                '<
http://a/> ' +
+                '
http://1.2/v:~-123. c');
+      expect(linky(undefined)).not.toBeDefined();
+    });
+
+    it('should handle mailto:', function() {
+      expect(linky("mailto:me@example.com").html).
+                      toEqual('
me@example.com');
+      expect(linky("me@example.com").html).
+                      toEqual('
me@example.com');
+      expect(linky("send email to me@example.com, but").html).
+        toEqual('send email to 
me@example.com, but');
+    });
+  });
+
+  describe('date', function() {
+
+    var morning  = new angular.mock.TzDate(+5, '2010-09-03T12:05:08.000Z'); //7am
+    var noon =     new angular.mock.TzDate(+5, '2010-09-03T17:05:08.000Z'); //12pm
+    var midnight = new angular.mock.TzDate(+5, '2010-09-03T05:05:08.000Z'); //12am
+    var earlyDate = new angular.mock.TzDate(+5, '0001-09-03T05:05:08.000Z');
+
+    var context, date;
+
+    beforeEach(inject(function($rootScope) {
+      context = $rootScope;
+      date = bind(context, filter.date);
+    }));
+
+    it('should ignore falsy inputs', function() {
+      expect(date(null)).toBeNull();
+      expect(date('')).toEqual('');
+    });
+
+    it('should do basic filter', function() {
+      expect(date(noon)).toEqual(date(noon, 'mediumDate'));
+      expect(date(noon, '')).toEqual(date(noon, 'mediumDate'));
+    });
+
+    it('should accept number or number string representing milliseconds as input', function() {
+      expect(date(noon.getTime())).toEqual(date(noon.getTime(), 'mediumDate'));
+      expect(date(noon.getTime() + "")).toEqual(date(noon.getTime() + "", 'mediumDate'));
+    });
+
+    it('should accept various format strings', function() {
+      expect(date(morning, "yy-MM-dd HH:mm:ss")).
+                      toEqual('10-09-03 07:05:08');
+
+      expect(date(midnight, "yyyy-M-d h=H:m:saZ")).
+                      toEqual('2010-9-3 12=0:5:8AM0500');
+
+      expect(date(midnight, "yyyy-MM-dd hh=HH:mm:ssaZ")).
+                      toEqual('2010-09-03 12=00:05:08AM0500');
+
+      expect(date(noon, "yyyy-MM-dd hh=HH:mm:ssaZ")).
+                      toEqual('2010-09-03 12=12:05:08PM0500');
+
+      expect(date(noon, "EEE, MMM d, yyyy")).
+                      toEqual('Fri, Sep 3, 2010');
+
+      expect(date(noon, "EEEE, MMMM dd, yyyy")).
+                      toEqual('Friday, September 03, 2010');
+
+      expect(date(earlyDate, "MMMM dd, y")).
+                      toEqual('September 03, 1');
+    });
+
+    it('should treat single quoted strings as string literals', function() {
+      expect(date(midnight, "yyyy'de' 'a'x'dd' 'adZ' h=H:m:saZ")).
+                      toEqual('2010de axdd adZ 12=0:5:8AM0500');
+    });
+
+    it('should treat a sequence of two single quotes as a literal single quote', function() {
+      expect(date(midnight, "yyyy'de' 'a''dd' 'adZ' h=H:m:saZ")).
+                      toEqual("2010de a'dd adZ 12=0:5:8AM0500");
+    });
+
+    it('should accept default formats', function() {
+
+      expect(date(noon, "medium")).
+                      toEqual('Sep 3, 2010 12:05:08 PM');
+
+      expect(date(noon, "short")).
+                      toEqual('9/3/10 12:05 PM');
+
+      expect(date(noon, "fullDate")).
+                      toEqual('Friday, September 3, 2010');
+
+      expect(date(noon, "longDate")).
+                      toEqual('September 3, 2010');
+
+      expect(date(noon, "mediumDate")).
+                      toEqual('Sep 3, 2010');
+
+      expect(date(noon, "shortDate")).
+                      toEqual('9/3/10');
+
+      expect(date(noon, "mediumTime")).
+                      toEqual('12:05:08 PM');
+
+      expect(date(noon, "shortTime")).
+                      toEqual('12:05 PM');
+    });
+
+    it('should be able to parse ISO 8601 dates/times using', function() {
+      var isoString = '2010-09-03T05:05:08.872Z';
+      expect(date(isoString)).
+          toEqual(date(isoString, 'mediumDate'));
+    });
+
+    it('should parse format ending with non-replaced string', function() {
+      expect(date(morning, 'yy/xxx')).toEqual('10/xxx');
+    });
+  });
+});
-- 
cgit v1.2.3