use crate::run;
#[test]
fn test_bless_and_ref() {
let code = r#"
my $obj = bless { a => 1 }, "My::Class";
ref($obj);
"#;
assert_eq!(run(code).expect("run").to_string(), "My::Class");
}
#[test]
fn test_method_call_basic() {
let code = r#"
package Foo {
sub new { bless { val => $_[1] }, "Foo" }
sub get_val { $_[0]->{val} }
}
my $obj = Foo->new(42);
$obj->get_val();
"#;
assert_eq!(run(code).expect("run").to_int(), 42);
}
#[test]
fn test_inheritance_isa() {
let code = r#"
package Parent {
sub identify { "parent" }
}
package Child {
our @ISA = ("Parent");
}
my $obj = bless {}, "Child";
$obj->identify();
"#;
assert_eq!(run(code).expect("run").to_string(), "parent");
}
#[test]
fn test_can_method() {
let code = r#"
package TestCan {
sub existing { 1 }
}
my $obj = bless {}, "TestCan";
my $c1 = $obj->can("existing") ? "yes" : "no";
my $c2 = $obj->can("nonexistent") ? "yes" : "no";
"$c1:$c2";
"#;
assert_eq!(run(code).expect("run").to_string(), "yes:no");
}
#[test]
fn test_nested_packages() {
let code = r#"
package Outer::Inner {
sub hello { "inner" }
}
Outer::Inner->hello();
"#;
assert_eq!(run(code).expect("run").to_string(), "inner");
}
#[test]
fn test_isa_builtin() {
let code = r#"
package Base { }
package Derived { our @ISA = ("Base") }
my $obj = bless {}, "Derived";
my $i1 = $obj->isa("Derived") ? 1 : 0;
my $i2 = $obj->isa("Base") ? 1 : 0;
my $i3 = $obj->isa("UNIVERSAL") ? 1 : 0;
my $i4 = $obj->isa("Other") ? 1 : 0;
"$i1$i2$i3$i4";
"#;
assert_eq!(run(code).expect("run").to_string(), "1110");
}
#[test]
fn test_method_override() {
let code = r#"
package P { sub meth { "P" } }
package C { our @ISA = ("P"); sub meth { "C" } }
my $obj = bless {}, "C";
$obj->meth();
"#;
assert_eq!(run(code).expect("run").to_string(), "C");
}
#[test]
fn test_explicit_package_call() {
let code = r#"
package P { sub meth { "P" } }
package C { our @ISA = ("P"); sub meth { P->meth() . "C" } }
my $obj = bless {}, "C";
$obj->meth();
"#;
assert_eq!(run(code).expect("run").to_string(), "PC");
}