mod common;
use common::{options_with_version, transform_fixture};
#[test]
fn no_worklet_directive_passes_through() {
let code = r#"
function regular() {
return 42;
}
export default regular;
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
insta::assert_snapshot!(out);
}
#[test]
fn function_with_worklet_directive() {
let code = r#"
function add(a, b) {
'worklet';
return a + b;
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
insta::assert_snapshot!(out);
}
#[test]
fn worklet_arrow_assigned_to_variable() {
let code = r#"
const square = (x) => {
'worklet';
return x * x;
};
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
insta::assert_snapshot!(out);
}
#[test]
fn use_animated_style_callback_is_workletized() {
let code = r#"
import { useAnimatedStyle } from 'react-native-reanimated';
function Component() {
const style = useAnimatedStyle(() => {
return { opacity: 1 };
});
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
insta::assert_snapshot!(out);
}
#[test]
fn worklet_captures_outer_variable() {
let code = r#"
const outer = 10;
function scale(x) {
'worklet';
return x * outer;
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
insta::assert_snapshot!(out);
}
#[test]
fn strict_global_captures_unlisted_globals() {
let code = r#"
function fn() {
'worklet';
return Math.random();
}
"#;
let mut opts = options_with_version();
opts.strict_global = true;
let out = transform_fixture("Sample.ts", code, opts);
insta::assert_snapshot!(out);
}
fn assert_contains(out: &str, needle: &str) {
assert!(
out.contains(needle),
"expected output to contain {needle:?}, got:\n{out}"
);
}
fn assert_not_contains(out: &str, needle: &str) {
assert!(
!out.contains(needle),
"expected output to NOT contain {needle:?}, got:\n{out}"
);
}
#[test]
fn worklet_class_marker_emits_factory_wrapper() {
let code = r#"
class Sky {
__workletClass = true;
draw() { this.x = 1; }
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
assert_not_contains(&out, "__workletClass");
assert_contains(&out, "Sky__classFactory");
assert_contains(&out, "Sky__classFactory()");
assert_contains(&out, "Sky.Sky__classFactory = Sky__classFactory");
insta::assert_snapshot!(out);
}
#[test]
fn worklet_class_marker_on_method_with_reserved_keyword_name() {
let code = r#"
class Ball {
__workletClass = true;
throw(vx, vy) { this.vx += vx; }
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
assert_contains(&out, "Ball__classFactory");
assert_not_contains(&out, "var throw =");
assert_not_contains(&out, "function throw(");
insta::assert_snapshot!(out);
}
#[test]
fn worklet_class_marker_preserves_named_export() {
let code = r#"
export class Sky {
__workletClass = true;
draw() { this.x = 1; }
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
assert_contains(&out, "Sky__classFactory");
assert_contains(&out, "export const Sky = Sky__classFactory()");
insta::assert_snapshot!(out);
}
#[test]
fn worklet_class_marker_preserves_default_export() {
let code = r#"
export default class Sky {
__workletClass = true;
draw() { this.x = 1; }
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
assert_contains(&out, "Sky__classFactory");
assert_contains(&out, "const Sky = Sky__classFactory()");
assert_contains(&out, "export default Sky");
insta::assert_snapshot!(out);
}
#[test]
fn worklet_class_marker_skipped_when_disabled() {
let code = r#"
class Sky {
__workletClass = true;
draw() { this.x = 1; }
}
"#;
let mut opts = options_with_version();
opts.disable_worklet_classes = true;
let out = transform_fixture("Sample.ts", code, opts);
assert_not_contains(&out, "Sky__classFactory");
assert_contains(&out, "__workletClass");
insta::assert_snapshot!(out);
}
#[test]
fn worklet_class_marker_skipped_in_bundle_mode() {
let code = r#"
class Sky {
__workletClass = true;
draw() { this.x = 1; }
}
"#;
let mut opts = options_with_version();
opts.bundle_mode = true;
let out = transform_fixture("Sample.ts", code, opts);
assert_not_contains(&out, "Sky__classFactory");
assert_contains(&out, "__workletClass");
assert_not_contains(&out, "drawFactory");
assert_not_contains(&out, "__workletHash");
insta::assert_snapshot!(out);
}
#[test]
fn worklet_class_marker_without_methods_still_wraps() {
let code = r#"
class Empty {
__workletClass = true;
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
assert_contains(&out, "Empty__classFactory");
assert_contains(&out, "const Empty = Empty__classFactory()");
assert_not_contains(&out, "__workletClass");
insta::assert_snapshot!(out);
}
#[test]
fn class_without_worklet_marker_passes_through() {
let code = r#"
class Plain {
draw() { this.x = 1; }
}
"#;
let out = transform_fixture("Sample.ts", code, options_with_version());
assert_not_contains(&out, "Plain__classFactory");
assert_not_contains(&out, "__workletHash");
assert_not_contains(&out, "__initData");
insta::assert_snapshot!(out);
}