Home | History | Annotate | Download | only in harmony
      1 // Copyright 2013 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // Flags: --harmony-strings
     29 
     30 assertEquals(1, String.prototype.endsWith.length);
     31 
     32 var testString = "Hello World";
     33 assertTrue(testString.endsWith(""));
     34 assertTrue(testString.endsWith("World"));
     35 assertFalse(testString.endsWith("world"));
     36 assertFalse(testString.endsWith("Hello World!"));
     37 assertFalse(testString.endsWith(null));
     38 assertFalse(testString.endsWith(undefined));
     39 
     40 assertTrue("null".endsWith(null));
     41 assertTrue("undefined".endsWith(undefined));
     42 
     43 var georgianUnicodeString = "\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7";
     44 assertTrue(georgianUnicodeString.endsWith(georgianUnicodeString));
     45 assertTrue(georgianUnicodeString.endsWith("\u10D4\u10D5\u10D6\u10D7"));
     46 assertFalse(georgianUnicodeString.endsWith("\u10D0"));
     47 
     48 assertThrows("String.prototype.endsWith.call(null, 'test')", TypeError);
     49 assertThrows("String.prototype.endsWith.call(null, null)", TypeError);
     50 assertThrows("String.prototype.endsWith.call(undefined, undefined)", TypeError);
     51 
     52 assertThrows("String.prototype.endsWith.apply(null, ['test'])", TypeError);
     53 assertThrows("String.prototype.endsWith.apply(null, [null])", TypeError);
     54 assertThrows("String.prototype.endsWith.apply(undefined, [undefined])", TypeError);
     55 
     56 var TEST_INPUT = [{
     57   msg: "Empty string", val: ""
     58 }, {
     59   msg: "Number 1234.34", val: 1234.34
     60 }, {
     61   msg: "Integer number 0", val: 0
     62 }, {
     63   msg: "Negative number -1", val: -1
     64 }, {
     65   msg: "Boolean true", val: true
     66 }, {
     67   msg: "Boolean false", val: false
     68 }, {
     69   msg: "Regular expression /\d+/", val: /\d+/
     70 }, {
     71   msg: "Empty array []", val: []
     72 }, {
     73   msg: "Empty object {}", val: {}
     74 }, {
     75   msg: "Array of size 3", val: new Array(3)
     76 }];
     77 
     78 function testNonStringValues() {
     79   var i = 0;
     80   var l = TEST_INPUT.length;
     81 
     82   for (; i < l; i++) {
     83     var e = TEST_INPUT[i];
     84     var v = e.val;
     85     var s = String(v);
     86     assertTrue(s.endsWith(v), e.msg);
     87     assertTrue(String.prototype.endsWith.call(v, v), e.msg);
     88     assertTrue(String.prototype.endsWith.apply(v, [v]), e.msg);
     89   }
     90 }
     91 testNonStringValues();
     92 
     93 var CustomType = function(value) {
     94   this.endsWith = String.prototype.endsWith;
     95   this.toString = function() {
     96     return String(value);
     97   }
     98 };
     99 
    100 function testCutomType() {
    101   var i = 0;
    102   var l = TEST_INPUT.length;
    103 
    104   for (; i < l; i++) {
    105     var e = TEST_INPUT[i];
    106     var v = e.val;
    107     var o = new CustomType(v);
    108     assertTrue(o.endsWith(v), e.msg);
    109   }
    110 }
    111 testCutomType();
    112 
    113 
    114 // Test cases found in FF
    115 assertTrue("abc".endsWith("abc"));
    116 assertTrue("abcd".endsWith("bcd"));
    117 assertTrue("abc".endsWith("c"));
    118 assertFalse("abc".endsWith("abcd"));
    119 assertFalse("abc".endsWith("bbc"));
    120 assertFalse("abc".endsWith("b"));
    121 assertTrue("abc".endsWith("abc", 3));
    122 assertTrue("abc".endsWith("bc", 3));
    123 assertFalse("abc".endsWith("a", 3));
    124 assertTrue("abc".endsWith("bc", 3));
    125 assertTrue("abc".endsWith("a", 1));
    126 assertFalse("abc".endsWith("abc", 1));
    127 assertTrue("abc".endsWith("b", 2));
    128 assertFalse("abc".endsWith("d", 2));
    129 assertFalse("abc".endsWith("dcd", 2));
    130 assertFalse("abc".endsWith("a", 42));
    131 assertTrue("abc".endsWith("bc", Infinity));
    132 assertFalse("abc".endsWith("a", Infinity));
    133 assertTrue("abc".endsWith("bc", undefined));
    134 assertFalse("abc".endsWith("bc", -43));
    135 assertFalse("abc".endsWith("bc", -Infinity));
    136 assertFalse("abc".endsWith("bc", NaN));
    137