1d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org//
4d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Redistribution and use in source and binary forms, with or without
5d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// modification, are permitted provided that the following conditions
6d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// are met:
7d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 1.  Redistributions of source code must retain the above copyright
8d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org//     notice, this list of conditions and the following disclaimer.
9d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// 2.  Redistributions in binary form must reproduce the above copyright
10d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org//     notice, this list of conditions and the following disclaimer in the
11d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org//     documentation and/or other materials provided with the distribution.
12d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org//
13d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
24d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgdescription("KDE JS Test");
25d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvar negativeZero = Math.atan2(-1, Infinity); // ### any nicer way?
26d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
27d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction isNegativeZero(n)
28d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{
29d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return n == 0 && 1 / n < 0;
30d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
31d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
32d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// self tests
33d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNegativeZero(negativeZero)");
34d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeFalse("isNegativeZero(0)");
35d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
36d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Constants
37d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.E", "'2.718281828459045'");
38d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.LN2", "'0.6931471805599453'");
39d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.LN10", "'2.302585092994046'");
40d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.LOG2E", "'1.4426950408889634'");
41d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.LOG10E", "'0.4342944819032518'");
42d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.PI", "'3.141592653589793'");
43d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.SQRT1_2", "'0.7071067811865476'");
44d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.SQRT2", "'1.4142135623730951'");
45d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
46d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Number.NaN", "'NaN'");
47d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Number.NEGATIVE_INFINITY", "'-Infinity'");
48d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Number.POSITIVE_INFINITY", "'Infinity'");
49d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
50d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Functions
51d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.abs(-5)", "5");
52d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.acos(0)", "Math.PI/2");
53d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.acos(1)", "0");
54d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.ceil(1.1)", "2");
55d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("String()+Math.sqrt(2)", "String()+Math.SQRT2");
56d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.ceil(1.6)", "2");
57d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(0)", "0");
58d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeFalse("isNegativeZero(Math.round(0))");
59d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNegativeZero(Math.round(negativeZero))");
60d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(0.2)", "0");
61d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNegativeZero(Math.round(-0.2))");
62d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNegativeZero(Math.round(-0.5))");
63d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(1.1)", "1");
64d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(1.6)", "2");
65d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(-3.5)", "-3");
66d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(-3.6)", "-4");
67d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNaN(Math.round())");
68d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNaN(Math.round(NaN))");
69d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(-Infinity)", "-Infinity");
70d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(Infinity)", "Infinity");
71d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(99999999999999999999.99)", "100000000000000000000");
72d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.round(-99999999999999999999.99)", "-100000000000000000000");
73d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
74d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Math.log()
75d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.log(Math.E*Math.E)", "2");
76d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNaN(Math.log(NaN))");
77d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNaN(Math.log(-1))");
78d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeFalse("isFinite(Math.log(0))");
79d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.log(1)", "0");
80d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeFalse("isFinite(Math.log(Infinity))");
81d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
82d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Math.min()
83d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNegativeZero(Math.min(negativeZero, 0))");
84d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
85d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Math.max()
86d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeFalse("isFinite(Math.max())");
87d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.max(1)", "1"); // NS 4.x and IE 5.x seem to know about 2 arg version only
88d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.max(1, 2, 3)", "3"); // NS 4.x and IE 5.x seem to know about 2 arg version only
89d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNaN(Math.max(1,NaN,3))");
90d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("!isNegativeZero(Math.max(negativeZero, 0))");
91d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
92d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
93d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orglist=""
94d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfor ( var i in Math ) { list += i + ','; }
95d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("list","''");
96d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
97d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvar my = new Object;
98d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgmy.v = 1;
99d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
100d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Deleting/assigning
101d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("delete my.v", "true")
102d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeUndefined("my.v");
103d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("delete Math.PI", "false")
104d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction myfunc( num ) { return num+1; }
105d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("my = myfunc, myfunc(4)", "5");
106d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
107d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Conversions
108d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Boolean(Math)", "true");
109d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBeTrue("isNaN(Number(Math));");
110d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
111d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Unicity
112d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.abs===Math.abs", "true")
113d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("Math.abs===Math.round", "false")
114d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
115d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Iteration
116d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgobj = new Object;
117d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgobj.a = 1;
118d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgobj.b = 2;
119d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orglist=""
120d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfor ( var i in obj ) { list += i + ','; }
121d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("list","'a,b,'");
122d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
123d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// (check that Math's properties and functions are not enumerable)
124d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orglist=""
125d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfor ( var i in Math ) { list += i + ','; }
126d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgshouldBe("list","''");
127d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
128d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgMath.myprop=true; // adding a custom property to the math object (why not?)
129d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orglist=""
130d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfor ( var i in Math ) { list += i + ','; }
131f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgshouldBe("list","'myprop,'");
132