1/* The contents of this file are subject to the Netscape Public
2 * License Version 1.1 (the "License"); you may not use this file
3 * except in compliance with the License. You may obtain a copy of
4 * the License at http://www.mozilla.org/NPL/
5 *
6 * Software distributed under the License is distributed on an "AS
7 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
8 * implied. See the License for the specific language governing
9 * rights and limitations under the License.
10 *
11 * The Original Code is Mozilla Communicator client code, released March
12 * 31, 1998.
13 *
14 * The Initial Developer of the Original Code is Netscape Communications
15 * Corporation. Portions created by Netscape are
16 * Copyright (C) 1998 Netscape Communications Corporation. All
17 * Rights Reserved.
18 *
19 * Contributor(s):
20 *
21 */
22/**
23	Filename:     switch2.js
24	Description:  'Tests the switch statement'
25
26    http://scopus.mcom.com/bugsplat/show_bug.cgi?id=323696
27
28	Author:       Norris Boyd
29	Date:         July 31, 1998
30*/
31
32	var SECTION = 'As described in Netscape doc "Whats new in JavaScript 1.2"';
33	var VERSION = 'no version';
34    startTest();
35	var TITLE   = 'statements: switch';
36	var BUGNUMBER="323626";
37
38	writeHeaderToLog("Executing script: switch2.js");
39	writeHeaderToLog( SECTION + " "+ TITLE);
40
41	var count = 0;
42	var testcases = new Array();
43
44	// test defaults not at the end; regression test for a bug that
45	// nearly made it into 4.06
46	function f0(i) {
47	    switch(i) {
48		default:
49		case "a":
50		case "b":
51		    return "ab*"
52		case "c":
53		    return "c";
54		case "d":
55		    return "d";
56	    }
57	    return "";
58	}
59	testcases[count++] = new TestCase(SECTION, 'switch statement',
60	                                  f0("a"), "ab*");
61
62	testcases[count++] = new TestCase(SECTION, 'switch statement',
63	                                  f0("b"), "ab*");
64
65	testcases[count++] = new TestCase(SECTION, 'switch statement',
66	                                  f0("*"), "ab*");
67
68	testcases[count++] = new TestCase(SECTION, 'switch statement',
69	                                  f0("c"), "c");
70
71	testcases[count++] = new TestCase(SECTION, 'switch statement',
72	                                  f0("d"), "d");
73
74	function f1(i) {
75	    switch(i) {
76		case "a":
77		case "b":
78		default:
79		    return "ab*"
80		case "c":
81		    return "c";
82		case "d":
83		    return "d";
84	    }
85	    return "";
86	}
87
88	testcases[count++] = new TestCase(SECTION, 'switch statement',
89	                                  f1("a"), "ab*");
90
91	testcases[count++] = new TestCase(SECTION, 'switch statement',
92	                                  f1("b"), "ab*");
93
94	testcases[count++] = new TestCase(SECTION, 'switch statement',
95	                                  f1("*"), "ab*");
96
97	testcases[count++] = new TestCase(SECTION, 'switch statement',
98	                                  f1("c"), "c");
99
100	testcases[count++] = new TestCase(SECTION, 'switch statement',
101	                                  f1("d"), "d");
102
103	// Switch on integer; will use TABLESWITCH opcode in C engine
104	function f2(i) {
105	    switch (i) {
106	        case 0:
107	        case 1:
108                    return 1;
109	        case 2:
110 	            return 2;
111	    }
112	    // with no default, control will fall through
113	    return 3;
114	}
115
116	testcases[count++] = new TestCase(SECTION, 'switch statement',
117	                                  f2(0), 1);
118
119	testcases[count++] = new TestCase(SECTION, 'switch statement',
120	                                  f2(1), 1);
121
122	testcases[count++] = new TestCase(SECTION, 'switch statement',
123	                                  f2(2), 2);
124
125	testcases[count++] = new TestCase(SECTION, 'switch statement',
126	                                  f2(3), 3);
127
128	// empty switch: make sure expression is evaluated
129	var se = 0;
130	switch (se = 1) {
131	}
132	testcases[count++] = new TestCase(SECTION, 'switch statement',
133	                                  se, 1);
134
135	// only default
136	se = 0;
137	switch (se) {
138	    default:
139  	        se = 1;
140	}
141	testcases[count++] = new TestCase(SECTION, 'switch statement',
142	                                  se, 1);
143
144	// in loop, break should only break out of switch
145	se = 0;
146	for (var i=0; i < 2; i++) {
147	    switch (i) {
148	        case 0:
149	        case 1:
150	            break;
151	    }
152	    se = 1;
153	}
154	testcases[count++] = new TestCase(SECTION, 'switch statement',
155	                                  se, 1);
156
157	// test "fall through"
158	se = 0;
159	i = 0;
160	switch (i) {
161	    case 0:
162	        se++;
163		/* fall through */
164	    case 1:
165	        se++;
166	        break;
167	}
168	testcases[count++] = new TestCase(SECTION, 'switch statement',
169	                                  se, 2);
170
171    test();
172
173	// Needed: tests for evaluation time of case expressions.
174	// This issue was under debate at ECMA, so postponing for now.
175
176	function test()	{
177	    writeLineToLog("hi");
178	   for ( tc=0; tc < testcases.length; tc++ ) {
179	        testcases[tc].passed = writeTestCaseResult(
180	        testcases[tc].expect,
181	        testcases[tc].actual,
182	        testcases[tc].description +" = "+
183	        testcases[tc].actual );
184	        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
185	   }
186	   stopTest();
187	   return ( testcases );
188	}
189