13ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Copyright 2009 the V8 project authors. All rights reserved.
23ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Redistribution and use in source and binary forms, with or without
33ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// modification, are permitted provided that the following conditions are
43ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// met:
53ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//
63ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//     * Redistributions of source code must retain the above copyright
73ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       notice, this list of conditions and the following disclaimer.
83ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//     * Redistributions in binary form must reproduce the above
93ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       copyright notice, this list of conditions and the following
103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       disclaimer in the documentation and/or other materials provided
113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       with the distribution.
123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//     * Neither the name of Google Inc. nor the names of its
133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       contributors may be used to endorse or promote products derived
143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       from this software without specific prior written permission.
153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//
163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Tests for simple assignments and literals inside an anonymous function
293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Test simple return statement.
313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertEquals(8, eval("(function() { return 8; })()"));
323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Test simple assignment
343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvar code = "(function() {\
353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block               var a;\
363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block               a = 8;\
373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block               return a;\
383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             })()";
393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertEquals(8, eval(code));
403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockcode = "(function() {\
423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           var x;\
433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           x = 'abc';\
443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           return x;\
453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block         })()";
463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertEquals("abc", eval(code));
473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Test assignment as an RHS expression
493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockcode = "(function() {\
513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           var x, y;\
523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           x = y = 8;\
533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           return x;\
543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block         })()";
553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertEquals(8, eval(code));
563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockcode = "(function() {\
593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           var x, y;\
603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           x = y = 8;\
613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           return y;\
623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block         })()";
633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertEquals(8, eval(code));
643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockcode = "(function() {\
673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           var x,y,z;\
683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block           return x = y = z = 8;\
693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block         })()";
703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertEquals(8, eval(code));
713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
72d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// Test object literals.
73d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvar a, b;
74d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockcode = "a = {x:8}";
75d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockeval(code);
76d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(8, a.x);
77d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
78d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockcode = "b = {x:a, y:'abc'}";
79d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockeval(code);
80d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(a, b.x);
81d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(8, b.x.x);
82d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals("abc", b.y);
83d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
84d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockcode = "({x:8, y:9}); 10";
85d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(10, eval(code));
86d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
87d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockcode = "({x:8, y:9})";
88d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockeval(code);
89d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(9, eval(code+".y"));
90d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
91d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockcode = "a = {2:8, x:9}";
92d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockeval(code);
93d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(8, a[2]);
94d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(8, a["2"]);
95d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(9, a["x"]);
96d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
97d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// Test regexp literals.
98d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
99d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blocka = /abc/;
100d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
101d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(/abc/, a);
102d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
103d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockcode = "/abc/; 8";
104d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockassertEquals(8, eval(code));
105