/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla 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/MPL/
 *
 * 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 JavaScript Engine testing utilities.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corp.
 * Portions created by the Initial Developer are Copyright (C) 2003
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   myngs@hotmail.com, pschwartau@netscape.com
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

/*
 *
 * Date:    05 June 2003
 * SUMMARY: Testing |with (f)| inside the definition of |function f()|
 *
 * See http://bugzilla.mozilla.org/show_bug.cgi?id=208496
 *
 * In this test, we check that static function properties of
 * of |f| are read correctly from within the |with(f)| block.
 *
 */
//-----------------------------------------------------------------------------
var gTestfile = 'regress-208496-002.js';
var UBound = 0;
var BUGNUMBER = 208496;
var summary = 'Testing |with (f)| inside the definition of |function f()|';
var STATIC_VALUE = 'read the static property';
var status = '';
var statusitems = [];
var actual = '(TEST FAILURE)';
var actualvalues = [];
var expect= '';
var expectedvalues = [];


function f(par)
{
  with(f)
  {
    actual = par;
  }

  return par;
}
f.par = STATIC_VALUE;


status = inSection(1);
f('abc'); // this sets |actual| inside |f|
expect = STATIC_VALUE;
addThis();

// test the return: should be the dynamic value
status = inSection(2);
actual = f('abc');
expect = 'abc';
addThis();

status = inSection(3);
f(111 + 222); // sets |actual| inside |f|
expect = STATIC_VALUE;
addThis();

// test the return: should be the dynamic value
status = inSection(4);
actual = f(111 + 222);
expect = 333;
addThis();


/*
 * Add a level of indirection via |x|
 */
function g(par)
{
  with(g)
  {
    var x = par;
    actual = x;
  }

  return par;
}
g.par = STATIC_VALUE;


status = inSection(5);
g('abc'); // this sets |actual| inside |g|
expect = STATIC_VALUE;
addThis();

// test the return: should be the dynamic value
status = inSection(6);
actual = g('abc');
expect = 'abc';
addThis();

status = inSection(7);
g(111 + 222); // sets |actual| inside |g|
expect = STATIC_VALUE;
addThis();

// test the return: should be the dynamic value
status = inSection(8);
actual = g(111 + 222);
expect = 333;
addThis();



//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------



function addThis()
{
  statusitems[UBound] = status;
  actualvalues[UBound] = actual;
  expectedvalues[UBound] = expect;
  UBound++;
}


function test()
{
  enterFunc('test');
  printBugNumber(BUGNUMBER);
  printStatus(summary);

  for (var i=0; i<UBound; i++)
  {
    reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
  }

  exitFunc ('test');
}
