1
0
mirror of https://github.com/robertkrimen/otto synced 2025-10-12 20:27:30 +08:00
otto/function_test.go
Robert Krimen 81de6c8f02 Fix writable/enumerable/configurable of *.prototype to be false
Number, String, Array, RegExp, Error, etc.
2013-06-15 17:38:16 -07:00

106 lines
2.3 KiB
Go

package otto
import (
. "./terst"
"testing"
)
func TestFunction(t *testing.T) {
Terst(t)
test := runTest()
test(`String.prototype.substring.length`, "2")
test(`
var abc = Object.getOwnPropertyDescriptor(Function, "prototype");
[ [ typeof Function.prototype, typeof Function.prototype.length, Function.prototype.length ],
[ abc.writable, abc.enumerable, abc.configurable ] ];
`, "function,number,0,false,false,false")
}
func TestFunction_apply(t *testing.T) {
Terst(t)
test := runTest()
test(`String.prototype.substring.length`, "2")
test(`String.prototype.substring.apply("abc", [1, 11])`, "bc")
}
func TestFunction_call(t *testing.T) {
Terst(t)
test := runTest()
test(`String.prototype.substring.length`, "2")
test(`String.prototype.substring.call("abc", 1, 11)`, "bc")
}
func TestFunctionArguments(t *testing.T) {
Terst(t)
test := runTest()
// Should not be able to delete arguments
test(`
function abc(def, arguments){
delete def;
return def;
}
abc(1);
`, "1")
// Again, should not be able to delete arguments
test(`
function abc(def){
delete def;
return def;
}
abc(1);
`, "1")
// Test typeof of a function argument
test(`
function abc(def, ghi, jkl){
return typeof jkl
}
abc("1st", "2nd", "3rd", "4th", "5th");
`, "string")
}
func TestFunctionDeclarationInFunction(t *testing.T) {
Terst(t)
// Function declarations happen AFTER parameter/argument declarations
// That is, a function declared within a function will shadow/overwrite
// declared parameters
test := runTest()
test(`
function abc(def){
return def;
function def(){
return 1;
}
}
typeof abc();
`, "function")
}
func TestFunction_bind(t *testing.T) {
Terst(t)
test := runTest()
test(`
abc = function(){
return "abc";
};
def = abc.bind();
def();
`, "abc")
test(`
abc = function(){
return arguments[1];
};
def = abc.bind(undefined, "abc");
ghi = abc.bind(undefined, "abc", "ghi");
[ def(), def("def"), ghi("def") ];
`, ",def,ghi")
}