1fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org//
4fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
5fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// modification, are permitted provided that the following conditions
6fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// are met:
7fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// 1.  Redistributions of source code must retain the above copyright
8fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org//     notice, this list of conditions and the following disclaimer.
9fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// 2.  Redistributions in binary form must reproduce the above copyright
10fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org//     notice, this list of conditions and the following disclaimer in the
11fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org//     documentation and/or other materials provided with the distribution.
12fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org//
13fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
24fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdescription(
25fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
26fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org'Test for proper handling of Unicode RegExps and <a href="http://bugzilla.webkit.org/show_bug.cgi?id=7445">bug 7445</a>: Gmail puts wrong subject in replies.'
27fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
28fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org);
29fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
30fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Regex to match Re in various languanges straight from Gmail source
31fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar I3=/^\s*(fwd|re|aw|antw|antwort|wg|sv|ang|odp|betreff|betr|transf|reenv\.|reenv|in|res|resp|resp\.|enc|\u8f6c\u53d1|\u56DE\u590D|\u041F\u0435\u0440\u0435\u0441\u043B|\u041E\u0442\u0432\u0435\u0442):\s*(.*)$/i;
32fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
33fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Other RegExs from Gmail source
34fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar Ci=/\s+/g;
35fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar BC=/^ /;
36fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar BG=/ $/;
37fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
38fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Strips leading Re or similar (from Gmail source)
39fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfunction cy(a) {
40fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    //var b = I3.exec(a);
41fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    var b = I3.exec(a);
42fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
43fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (b) {
44fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        a = b[2];
45fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
46fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
47fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return Gn(a);
48fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
49fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
50fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// This function replaces consecutive whitespace with a single space
51fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// then removes a leading and trailing space if they exist. (From Gmail)
52fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfunction Gn(a) {
53fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return a.replace(Ci, " ").replace(BC, "").replace(BG, "");
54fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
55fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
56fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("cy('Re: Moose')", "'Moose'")
57fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("cy('\\u8f6c\\u53d1: Moose')", "'Moose'")
58fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
59fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Test handling of \u2820 (skull and crossbones)
60fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar sample="sample bm\u2820p cm\\u2820p";
61fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
62fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar inlineRe=/.m\u2820p/
63fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar evalInlineRe=eval("/.m\\u2820p/")
64fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar explicitRe=new RegExp(".m\\u2820p")
65fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar newFromInlineRe=new RegExp(inlineRe.source)
66fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar evalFromInlineRe=eval(inlineRe.toString())
67fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar newFromEvalInlineRe=new RegExp(evalInlineRe.source)
68fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar evalFromEvalInlineRe=eval(evalInlineRe.toString())
69fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar newFromExplicitRe=new RegExp(explicitRe.source)
70fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar evalFromExplicitRe=eval(explicitRe.toString())
71fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
72fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "newFromInlineRe.source")
73fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "evalFromInlineRe.source")
74fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "evalInlineRe.source")
75fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "newFromEvalInlineRe.source")
76fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "evalFromEvalInlineRe.source")
77fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "explicitRe.source")
78fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "newFromExplicitRe.source")
79fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.source", "evalFromExplicitRe.source")
80fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
81fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "newFromInlineRe.toString()")
82fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "evalFromInlineRe.toString()")
83fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "evalInlineRe.toString()")
84fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "newFromEvalInlineRe.toString()")
85fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "evalFromEvalInlineRe.toString()")
86fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "explicitRe.toString()")
87fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "newFromExplicitRe.toString()")
88fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.toString()", "evalFromExplicitRe.toString()")
89fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
90fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("inlineRe.exec(sample)[0]", "'bm\u2820p'")
91fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("evalInlineRe.exec(sample)[0]", "'bm\u2820p'")
92fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("explicitRe.exec(sample)[0]", "'bm\u2820p'")
93fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
94fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
95fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Test handling of \u007c "|"
96fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bsample="sample bm\u007cp cm\\u007cp";
97fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
98fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar binlineRe=/.m\u007cp/
99fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bevalInlineRe=eval("/.m\\u007cp/")
100fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bexplicitRe=new RegExp(".m\\u007cp")
101fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bnewFromInlineRe=new RegExp(binlineRe.source)
102fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bevalFromInlineRe=eval(binlineRe.toString())
103fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bnewFromEvalInlineRe=new RegExp(bevalInlineRe.source)
104fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bevalFromEvalInlineRe=eval(bevalInlineRe.toString())
105fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bnewFromExplicitRe=new RegExp(bexplicitRe.source)
106fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvar bevalFromExplicitRe=eval(bexplicitRe.toString())
107fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
108fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bnewFromInlineRe.source")
109fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bevalFromInlineRe.source")
110fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bevalInlineRe.source")
111fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bnewFromEvalInlineRe.source")
112fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bevalFromEvalInlineRe.source")
113fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bexplicitRe.source")
114fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bnewFromExplicitRe.source")
115fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.source", "bevalFromExplicitRe.source")
116fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
117fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bnewFromInlineRe.toString()")
118fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bevalFromInlineRe.toString()")
119fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bevalInlineRe.toString()")
120fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bnewFromEvalInlineRe.toString()")
121fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bevalFromEvalInlineRe.toString()")
122fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bexplicitRe.toString()")
123fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bnewFromExplicitRe.toString()")
124fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.toString()", "bevalFromExplicitRe.toString()")
125fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
126fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("binlineRe.exec(bsample)[0]", "'bm|p'")
127fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("bevalInlineRe.exec(bsample)[0]", "'bm|p'")
128fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgshouldBe("bexplicitRe.exec(bsample)[0]", "'bm|p'")
129