📄 test.pl
字号:
## ***** 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 Mozilla Communicator client code, released# March 31, 1998.## The Initial Developer of the Original Code is# Netscape Communications Corporation.# Portions created by the Initial Developer are Copyright (C) 1998# the Initial Developer. All Rights Reserved.## Contributor(s):## 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 *****## Test file for JS.pm############################################################## support packages for test script######################################################################################################################### Fotrikpackage Father;sub old_meth { return "Father::old_meth";}############################################################# Synacekpackage Son;use vars qw( @ISA );@ISA = qw( Father );sub new { my $class = shift; $class = ref $class || $class; my $self = {}; bless $self, $class; return $self;}sub new_meth { return "Son::new_meth";}############################################################# Proxypackage Proxy;sub new { my $class = shift; $class = ref $class || $class; my $self = { property => shift }; bless $self, $class; return $self; }sub getObj { my $ret = new Son(); return $ret;}sub getValue { my $self = shift; return $self->{ property };}sub getArray { my $self = shift; return [34, 35, 36, 37, 38];}sub getHash { my $self = shift; return { testkey1 => 'testvalue1', testkey2 => 'testvalue2', testkey3 => 'testvalue3', };}############################################################# main part of the test script############################################################package main;use JS;BEGIN { $| = 1; print "1..12\n"; }END { print "not ok 1\n" unless $loaded; }$loaded = 1;print "ok 1\n";use strict; #no typos, pleasemy $rt = new JS(1_204 ** 2);my $cx = $rt->createContext(8 * 1_024);my $jsval;my $testc = 1; #testcounter############################################################# the simplest test$testc++;$jsval = $cx->eval('6;');print $jsval == 6 ? "ok $testc\n" : "not ok $testc\n"; #2#############################################################second very simple test$testc++;$jsval = $cx->eval('"hallo";');print $jsval eq "hallo" ? "ok $testc\n" : "not ok $testc\n"; #3############################################################# third very simple test$testc++;$jsval = $cx->eval("1.23");print $jsval == 1.23 ? "ok $testc\n" : "not ok $testc\n"; #4#############################################################undef is little bit tricky$testc++;$jsval = $cx->eval('undefined');print ! defined $jsval ? "ok $testc\n" : "not ok $testc\n"; #5#############################################################can ve tie js objects? (generally to hash, Arrays to arrays too)$testc++;$jsval = $cx->eval('foo = new Object(); foo.prop = 11; foo;');my %hash;#read js propertytie %hash, 'JS::Object', $jsval;print $hash{prop} == 11 ? "ok $testc\n" : "not ok $testc\n"; #6#############################################################set js propertry $testc++;$hash{prop2} = 2;$jsval = $cx->eval('foo.prop2;');print $jsval == 2 ? "ok $testc\n" : "not ok $testc\n"; #7#############################################################tie array$testc++;my @arr;$jsval = $cx->eval('arr = new Array(); arr[0] = 0; arr[1] = 1; arr;');tie @arr, "JS::Object", $jsval;print ((($#arr == 1) && ($arr[1] == 1)) ? "ok $testc\n" : "not ok $testc\n");#8############################################################# object delegation test$testc++;$cx->createObject(new Proxy("init_value"), "perlobj", { getObj => \&Proxy::getObj, getValue => \&Proxy::getValue, getArray => \&Proxy::getArray, getHash => \&Proxy::getHash, });$jsval = $cx->eval("perlobj.getValue()");print $jsval eq "init_value" ? "ok $testc\n" : "not ok $testc\n"; #9############################################################# perl object returned to js$testc++;$jsval = $cx->eval("po = perlobj.getObj(); po.new_meth()");print $jsval eq "Son::new_meth" ? "ok $testc\n" : "not ok $testc\n"; #10############################################################# and what about inherited methods?$testc++;$jsval = $cx->eval("po.old_meth()");print $jsval eq "Father::old_meth" ? "ok $testc\n" : "not ok $testc\n"; #11############################################################# pass an array, check the element$testc++;$jsval = $cx->eval("parr = perlobj.getArray(); parr[2];");print $jsval == 36 ? "ok $testc\n" : "not ok $testc\n"; #12############################################################# check the array length$testc++;$jsval = $cx->eval("parr.length");print $jsval == 5 ? "ok $testc\n" : "not ok $testc\n"; #13############################################################# pass a hash, check the element$testc++;$jsval = $cx->eval("phash = perlobj.getHash(); phash.testkey1;");print $jsval eq 'testvalue1' ? "ok $testc\n" : "not ok $testc\n"; #14############################################################# error test$testc++;my $line;my $err;sub js_ErrorReporter { my ($msg, $file, $line, $linebuf, $token) = @_; $err = "line $line $msg";}$cx->setErrorReporter( \&js_ErrorReporter );$cx->eval("x = 2 + 4;\nx.method()\n");print $err =~ /^line 1/ ? "ok $testc\n" : "not ok $testc\n"; #15############################################################# cleanup# so far we have to undef context value, to make sure,# it is disposed before runtimeundef $cx;undef $rt;__END__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -