The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
######################################################################
# Testcase:     Set/Get properties of objects
# Revision:     $Revision: 1.1.1.1 $
# Last Checkin: $Date: 2006/02/01 06:00:49 $
# By:           $Author: mschilli $
#
# Author: Mike Schilli m@perlmeister.com, 2002
######################################################################

use warnings;
use strict;

print "1..6\n";

use JavaScript::SpiderMonkey;
my $js = JavaScript::SpiderMonkey->new();
$js->init();

our $buffer = "";

sub getter {
    my(@args) = @_;
    $buffer .= "GETTER: @args\n";
}

sub setter {
    my(@args) = @_;
    $buffer .= "SETTER: @args\n";
}

$js->property_by_path("navigator.appName", "", \&getter, \&setter);

    # Function to write something from JS to a Perl $buffer

my $code = <<EOT;
  navigator.appName      = "Netscape";
  navigator.schnapp      = navigator.appName;
  navigator.appName      = "Netscape2";
  navigator.schnapp      = navigator.appName;
EOT

my $rc = $js->eval($code);

# Check return code
print "not " if $rc != 1;
print "ok 1\n";

# Check output
my $wanted = "SETTER: navigator.appName Netscape\n" .
             "GETTER: navigator.appName Netscape\n" .
             "SETTER: navigator.appName Netscape2\n" .
             "GETTER: navigator.appName Netscape2\n";
if($buffer ne $wanted) {
    print "not ok 2\n";
    print "Expected $wanted but got '$buffer'\n";
} else {
    print "ok 2\n";
}

$js->destroy();

##################################################
# Setter only, no getter
##################################################
$js = JavaScript::SpiderMonkey->new();
$js->init();

$buffer = "";

$js->property_by_path("navigator.appName", "", undef, \&setter);

$rc = $js->eval($code);

# Check return code
print "not " if $rc != 1;
print "ok 3\n";

# Check output
$wanted = "SETTER: navigator.appName Netscape\n" .
          "SETTER: navigator.appName Netscape2\n";

if($buffer ne $wanted) {
    print "not ok 4\n";
    print "Expected $wanted but got '$buffer'\n";
} else {
    print "ok 4\n";
}

$js->destroy();

##################################################
# Getter only, no setter
##################################################
$js = JavaScript::SpiderMonkey->new();
$js->init();

$buffer = "";

$js->property_by_path("navigator.appName", "", \&getter);

$rc = $js->eval($code);

# Check return code
print "not " if $rc != 1;
print "ok 5\n";

# Check output
$wanted = "GETTER: navigator.appName Netscape\n" .
          "GETTER: navigator.appName Netscape2\n";

if($buffer ne $wanted) {
    print "not ok 6\n";
    print "Expected $wanted but got '$buffer'\n";
} else {
    print "ok 6\n";
}

$js->destroy();