Home | History | Annotate | Download | only in harmony
      1 // Copyright 2012 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-modules --harmony-scoping
     29 
     30 // Test basic module linking and initialization.
     31 
     32 "use strict";
     33 
     34 module R {
     35   // At this point, only functions and modules are initialized.
     36   assertEquals(undefined, v)
     37   assertEquals(undefined, vv)
     38   assertEquals(undefined, R.v)
     39   assertEquals(undefined, M.v)
     40   assertEquals(undefined, MM.v)
     41   assertEquals(undefined, F.v)
     42   assertEquals(undefined, G.v)
     43   assertThrows(function() { l }, ReferenceError)
     44   assertThrows(function() { ll }, ReferenceError)
     45   assertThrows(function() { R.l }, ReferenceError)
     46   assertThrows(function() { M.l }, ReferenceError)
     47   assertThrows(function() { MM.l }, ReferenceError)
     48   assertThrows(function() { F.l }, ReferenceError)
     49   assertThrows(function() { G.l }, ReferenceError)
     50   assertThrows(function() { c }, ReferenceError)
     51   assertThrows(function() { cc }, ReferenceError)
     52   assertThrows(function() { R.c }, ReferenceError)
     53   assertThrows(function() { M.c }, ReferenceError)
     54   assertThrows(function() { MM.c }, ReferenceError)
     55   assertThrows(function() { F.c }, ReferenceError)
     56   assertThrows(function() { G.c }, ReferenceError)
     57   assertEquals(4, f())
     58   assertEquals(24, ff())
     59   assertEquals(4, R.f())
     60   assertEquals(14, M.f())
     61   assertEquals(34, MM.f())
     62   assertEquals(44, F.f())
     63   assertEquals(14, G.f())
     64 
     65   // All properties should already exist on the instance objects, though.
     66   assertTrue("v" in R)
     67   assertTrue("v" in RR)
     68   assertTrue("v" in M)
     69   assertTrue("v" in MM)
     70   assertTrue("v" in F)
     71   assertTrue("v" in G)
     72   assertTrue("l" in R)
     73   assertTrue("l" in RR)
     74   assertTrue("l" in M)
     75   assertTrue("l" in MM)
     76   assertTrue("l" in F)
     77   assertTrue("l" in G)
     78   assertTrue("c" in R)
     79   assertTrue("c" in RR)
     80   assertTrue("c" in M)
     81   assertTrue("c" in MM)
     82   assertTrue("c" in F)
     83   assertTrue("c" in G)
     84   assertTrue("f" in R)
     85   assertTrue("f" in RR)
     86   assertTrue("f" in M)
     87   assertTrue("f" in MM)
     88   assertTrue("f" in F)
     89   assertTrue("f" in G)
     90   assertTrue("M" in R)
     91   assertTrue("M" in RR)
     92   assertTrue("RR" in R)
     93   assertTrue("RR" in RR)
     94 
     95   // And aliases should be identical.
     96   assertSame(R, RR)
     97   assertSame(R, R.RR)
     98   assertSame(M, R.M)
     99   assertSame(M, G)
    100 
    101   // We can only assign to var.
    102   assertEquals(-1, v = -1)
    103   assertEquals(-2, R.v = -2)
    104   assertEquals(-2, v)
    105   assertEquals(-2, R.v)
    106 
    107   assertThrows(function() { l = -1 }, ReferenceError)
    108   assertThrows(function() { R.l = -2 }, ReferenceError)
    109   assertThrows(function() { l }, ReferenceError)
    110   assertThrows(function() { R.l }, ReferenceError)
    111 
    112   assertThrows(function() { eval("c = -1") }, SyntaxError)
    113   assertThrows(function() { R.c = -2 }, TypeError)
    114 
    115   // Initialize first bunch of variables.
    116   export var v = 1
    117   export let l = 2
    118   export const c = 3
    119   export function f() { return 4 }
    120 
    121   assertEquals(1, v)
    122   assertEquals(1, R.v)
    123   assertEquals(2, l)
    124   assertEquals(2, R.l)
    125   assertEquals(3, c)
    126   assertEquals(3, R.c)
    127 
    128   assertEquals(-3, v = -3)
    129   assertEquals(-4, R.v = -4)
    130   assertEquals(-3, l = -3)
    131   assertEquals(-4, R.l = -4)
    132   assertThrows(function() { eval("c = -3") }, SyntaxError)
    133   assertThrows(function() { R.c = -4 }, TypeError)
    134 
    135   assertEquals(-4, v)
    136   assertEquals(-4, R.v)
    137   assertEquals(-4, l)
    138   assertEquals(-4, R.l)
    139   assertEquals(3, c)
    140   assertEquals(3, R.c)
    141 
    142   // Initialize nested module.
    143   export module M {
    144     export var v = 11
    145     export let l = 12
    146     export const c = 13
    147     export function f() { return 14 }
    148   }
    149 
    150   assertEquals(11, M.v)
    151   assertEquals(11, G.v)
    152   assertEquals(12, M.l)
    153   assertEquals(12, G.l)
    154   assertEquals(13, M.c)
    155   assertEquals(13, G.c)
    156 
    157   // Initialize non-exported variables.
    158   var vv = 21
    159   let ll = 22
    160   const cc = 23
    161   function ff() { return 24 }
    162 
    163   assertEquals(21, vv)
    164   assertEquals(22, ll)
    165   assertEquals(23, cc)
    166 
    167   // Initialize non-exported module.
    168   module MM {
    169     export var v = 31
    170     export let l = 32
    171     export const c = 33
    172     export function f() { return 34 }
    173   }
    174 
    175   assertEquals(31, MM.v)
    176   assertEquals(32, MM.l)
    177   assertEquals(33, MM.c)
    178 
    179   // Recursive self reference.
    180   export module RR = R
    181 }
    182 
    183 // Initialize sibling module that was forward-used.
    184 module F {
    185   assertEquals(undefined, v)
    186   assertEquals(undefined, F.v)
    187   assertThrows(function() { l }, ReferenceError)
    188   assertThrows(function() { F.l }, ReferenceError)
    189   assertThrows(function() { c }, ReferenceError)
    190   assertThrows(function() { F.c }, ReferenceError)
    191 
    192   export var v = 41
    193   export let l = 42
    194   export const c = 43
    195   export function f() { return 44 }
    196 
    197   assertEquals(41, v)
    198   assertEquals(41, F.v)
    199   assertEquals(42, l)
    200   assertEquals(42, F.l)
    201   assertEquals(43, c)
    202   assertEquals(43, F.c)
    203 }
    204 
    205 // Define recursive module alias.
    206 module G = R.M
    207 
    208 
    209 
    210 // Second test with side effects and more module nesting.
    211 
    212 let log = "";
    213 
    214 export let x = (log += "1");
    215 
    216 export module B = A.B
    217 
    218 export module A {
    219   export let x = (log += "2");
    220   let y = (log += "3");
    221   export function f() { log += "5" };
    222   export module B {
    223     module BB = B;
    224     export BB, x;
    225     let x = (log += "4");
    226     f();
    227     let y = (log += "6");
    228   }
    229   export let z = (log += "7");
    230   export module C {
    231     export let z = (log += "8");
    232     export module D = B
    233     export module C = A.C
    234   }
    235   module D {}
    236 }
    237 
    238 export module M1 {
    239   export module A2 = M2;
    240   export let x = (log += "9");
    241 }
    242 export module M2 {
    243   export module A1 = M1;
    244   export let x = (log += "0");
    245 }
    246 
    247 assertEquals("object", typeof A);
    248 assertTrue('x' in A);
    249 assertFalse('y' in A);
    250 assertTrue('f' in A);
    251 assertTrue('B' in A);
    252 assertTrue('z' in A);
    253 assertTrue('C' in A);
    254 assertFalse('D' in A);
    255 
    256 assertEquals("object", typeof B);
    257 assertTrue('BB' in B);
    258 assertTrue('x' in B);
    259 assertFalse('y' in B);
    260 
    261 assertEquals("object", typeof A.B);
    262 assertTrue('BB' in A.B);
    263 assertTrue('x' in A.B);
    264 assertFalse('y' in A.B);
    265 
    266 assertEquals("object", typeof A.B.BB);
    267 assertTrue('BB' in A.B.BB);
    268 assertTrue('x' in A.B.BB);
    269 assertFalse('y' in A.B.BB);
    270 
    271 assertEquals("object", typeof A.C);
    272 assertTrue('z' in A.C);
    273 assertTrue('D' in A.C);
    274 assertTrue('C' in A.C);
    275 
    276 assertEquals("object", typeof M1);
    277 assertEquals("object", typeof M2);
    278 assertTrue('A2' in M1);
    279 assertTrue('A1' in M2);
    280 assertEquals("object", typeof M1.A2);
    281 assertEquals("object", typeof M2.A1);
    282 assertTrue('A1' in M1.A2);
    283 assertTrue('A2' in M2.A1);
    284 assertEquals("object", typeof M1.A2.A1);
    285 assertEquals("object", typeof M2.A1.A2);
    286 
    287 assertSame(B, A.B);
    288 assertSame(B, B.BB);
    289 assertSame(B, A.C.D);
    290 assertSame(A.C, A.C.C);
    291 assertFalse(A.D === A.C.D);
    292 
    293 assertSame(M1, M2.A1);
    294 assertSame(M2, M1.A2);
    295 assertSame(M1, M1.A2.A1);
    296 assertSame(M2, M2.A1.A2);
    297 
    298 assertEquals("1234567890", log);
    299