/*
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 * 
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 * 
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 * 
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * JDK-8058422: Users should be able to overwrite "context" and "engine" variables
 *
 * @test
 * @run
 */

var m = new javax.script.ScriptEngineManager();
var e = m.getEngineByName("nashorn");
e.put("foo", "hello");
var obj = e.eval("context.getAttribute('foo')");
if (obj != "hello") {
    fail("Expected 'obj' to be 'hello'");
}

e.put("context", "bar");
if (e.eval("context") != "bar") {
    fail("Expected 'context' to be 'bar'");
}

if (e.eval("foo") != "hello") {
    fail("Expected 'foo' to be 'hello'");
}

if (e.eval("engine") != e) {
    fail("'engine' is not evaluaed to current engine");
}

e.put("engine", "foobar");
if (e.eval("engine") != "foobar") {
    fail("'engine' is not evalued to 'foobar'");
}
