/* The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is Mozilla Communicator client code, released March
 * 31, 1998.
 *
 * The Initial Developer of the Original Code is Netscape Communications
 * Corporation. Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 * 
 */
/**
    File Name:          7.1-1.js
    ECMA Section:       7.1 White Space
    Description:        - readability
                        - separate tokens
                        - otherwise should be insignificant
                        - in strings, white space characters are significant
                        - cannot appear within any other kind of token

                        white space characters are:
                        unicode     name            formal name     string representation
                        \u0009      tab             <TAB>           \t
                        \u000B      veritical tab   <VT>            \v
                        \U000C      form feed       <FF>            \f
                        \u0020      space           <SP>            " "

    Author:             christine@netscape.com
    Date:               11 september 1997
*/

    var SECTION = "7.1-1";
    var VERSION = "ECMA_1";
    startTest();
    var TITLE   = "White Space";

    writeHeaderToLog( SECTION + " "+ TITLE);

    var testcases = getTestCases();
    test();


function getTestCases() {
    var array = new Array();
    var item = 0;

    // whitespace between var keyword and identifier

    array[item++] = new TestCase( SECTION,  'var'+'\t'+'MYVAR1=10;MYVAR1',   10, eval('var'+'\t'+'MYVAR1=10;MYVAR1') );
    array[item++] = new TestCase( SECTION,  'var'+'\f'+'MYVAR2=10;MYVAR2',   10, eval('var'+'\f'+'MYVAR2=10;MYVAR2') );
    array[item++] = new TestCase( SECTION,  'var'+'\v'+'MYVAR2=10;MYVAR2',   10, eval('var'+'\v'+'MYVAR2=10;MYVAR2') );
    array[item++] = new TestCase( SECTION,  'var'+'\ '+'MYVAR2=10;MYVAR2',   10, eval('var'+'\ '+'MYVAR2=10;MYVAR2') );

    // use whitespace between tokens object name, dot operator, and object property

    array[item++] = new TestCase( SECTION,
                                  "var a = new Array(12345); a\t\v\f .\\u0009\\000B\\u000C\\u0020length",
                                  12345,
                                  eval("var a = new Array(12345); a\t\v\f .\u0009\u0020\u000C\u000Blength") );


    return ( array );
}
function test() {
    for ( tc=0; tc < testcases.length; tc++ ) {
        testcases[tc].passed = writeTestCaseResult(
                            testcases[tc].expect,
                            testcases[tc].actual,
                            testcases[tc].description +" = "+
                            testcases[tc].actual );

        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
    }
    stopTest();
    return ( testcases );
}