summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_5/Expressions/primitive-this-boxing-behavior.js
blob: 36cc0e9e8b42f064973d376b063cbd8cdbf7f001 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/

//-----------------------------------------------------------------------------
var BUGNUMBER = 732669;
var summary = "Primitive values don't box correctly";

print(BUGNUMBER + ": " + summary);

/**************
 * BEGIN TEST *
 **************/

var t;
function returnThis() { return this; }

// Boolean

Boolean.prototype.method = returnThis;
t = true.method();
assertEq(t !== Boolean.prototype, true);
assertEq(t.toString(), "true");

Object.defineProperty(Boolean.prototype, "property", { get: returnThis, configurable: true });
t = false.property;
assertEq(t !== Boolean.prototype, true);
assertEq(t.toString(), "false");

delete Boolean.prototype.method;
delete Boolean.prototype.property;


// Number

Number.prototype.method = returnThis;
t = 5..method();
assertEq(t !== Number.prototype, true);
assertEq(t.toString(), "5");

Object.defineProperty(Number.prototype, "property", { get: returnThis, configurable: true });
t = 17..property;
assertEq(t !== Number.prototype, true);
assertEq(t.toString(), "17");

delete Number.prototype.method;
delete Number.prototype.property;


// String

String.prototype.method = returnThis;
t = "foo".method();
assertEq(t !== String.prototype, true);
assertEq(t.toString(), "foo");

Object.defineProperty(String.prototype, "property", { get: returnThis, configurable: true });
t = "bar".property;
assertEq(t !== String.prototype, true);
assertEq(t.toString(), "bar");

delete String.prototype.method;
delete String.prototype.property;


// Object

Object.prototype.method = returnThis;

t = true.method();
assertEq(t !== Object.prototype, true);
assertEq(t !== Boolean.prototype, true);
assertEq(t.toString(), "true");

t = 42..method();
assertEq(t !== Object.prototype, true);
assertEq(t !== Number.prototype, true);
assertEq(t.toString(), "42");

t = "foo".method();
assertEq(t !== Object.prototype, true);
assertEq(t !== String.prototype, true);
assertEq(t.toString(), "foo");

Object.defineProperty(Object.prototype, "property", { get: returnThis, configurable: true });

t = false.property;
assertEq(t !== Object.prototype, true);
assertEq(t !== Boolean.prototype, true);
assertEq(t.toString(), "false");

t = 8675309..property;
assertEq(t !== Object.prototype, true);
assertEq(t !== Number.prototype, true);
assertEq(t.toString(), "8675309");

t = "bar".property;
assertEq(t !== Object.prototype, true);
assertEq(t !== String.prototype, true);
assertEq(t.toString(), "bar");

/******************************************************************************/

if (typeof reportCompare === "function")
  reportCompare(true, true);

print("Tests complete");