1/*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * JDK-8021122: Not all callables are handled for toString and other function valued properties
26 *
27 * @test
28 * @run
29 */
30
31var a = {}
32var obj = new java.util.HashMap();
33Object.bindProperties(a, obj);
34try {
35    print(a);
36} catch (e) {
37    print(e);
38}
39
40var a = {}
41var global = loadWithNewGlobal({ name:"xx", script: "this" });
42var obj = global.eval("({ toString: function() { return 'hello'; } })");
43Object.bindProperties(a, obj);
44try {
45    print(a);
46} catch (e) {
47    print(e);
48}
49
50function runLambdaTests() {
51    var r = new java.lang.Runnable() {
52        run: function() { print("I am runnable"); }
53    };
54
55    // call any @FunctionalInterface object as though it is a function
56    r();
57
58    var twice = new java.util.function.Function() {
59        apply: function(x) 2*x
60    };
61
62    print(twice(34));
63
64    var sum = new java.util.function.BiFunction() {
65        apply: function(x, y) x + y
66    };
67
68    print(sum(32, 12))
69
70    // make toString to be a @FunctionalInterface object
71    var a = {};
72    a.toString = new java.util.function.Supplier() {
73        get: function() { return "MyString"; }
74    };
75
76    try {
77        print(a);
78    } catch (e) {
79        print(e);
80    }
81}
82
83try {
84    // check for java.util.function.Function class
85    Java.type("java.util.function.Function");
86    runLambdaTests();
87} catch (e) {
88    // fake output to match .EXPECTED values
89    print("I am runnable");
90    print("68");
91    print("44");
92    print("MyString");
93}
94