use nargo_compiler::Compiler;
#[test]
fn test_compiler_initialization() {
let compiler = Compiler::new();
assert_eq!(compiler.get_css(), "");
}
#[test]
fn test_compiler_compile_with_invalid_syntax() {
let mut compiler = Compiler::new();
let source = r#"
<template>
<div>
<!-- Missing closing tag -->
<p>Hello
</div>
</template>
"#;
let result = compiler.compile("InvalidComp", source);
assert!(result.is_err());
}
#[test]
fn test_compiler_compile_with_empty_template() {
let mut compiler = Compiler::new();
let source = r#"
<template>
</template>
"#;
let result = compiler.compile("EmptyComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'EmptyComp'"));
}
#[test]
fn test_compiler_compile_with_only_script() {
let mut compiler = Compiler::new();
let source = r#"
<script>
const [count, setCount] = createSignal(0);
</script>
"#;
let result = compiler.compile("ScriptOnlyComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'ScriptOnlyComp'"));
assert!(js.code.contains("const [count, setCount] = createSignal(0);"));
}
#[test]
fn test_compiler_compile_with_props() {
let mut compiler = Compiler::new();
let source = r#"
<template>
<div>{{ message }}</div>
</template>
<script>
const props = defineProps({
message: String
});
</script>
"#;
let result = compiler.compile("PropsComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'PropsComp'"));
assert!(js.code.contains("props: {"));
assert!(js.code.contains("message: String"));
}
#[test]
fn test_compiler_compile_with_emits() {
let mut compiler = Compiler::new();
let source = r#"
<template>
<button @click="emit('click', $event)">Click</button>
</template>
<script>
const emit = defineEmits(['click']);
</script>
"#;
let result = compiler.compile("EmitsComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'EmitsComp'"));
assert!(js.code.contains("emits: ['click']"));
}
#[test]
fn test_compiler_compile_with_computed() {
let mut compiler = Compiler::new();
let source = r#"
<template>
<div>{{ doubledCount }}</div>
</template>
<script>
const [count, setCount] = createSignal(0);
const doubledCount = createComputed(() => count() * 2);
</script>
"#;
let result = compiler.compile("ComputedComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'ComputedComp'"));
assert!(js.code.contains("createComputed(() => count() * 2)"));
assert!(js.code.contains("doubledCount"));
}
#[test]
fn test_compiler_compile_with_watch() {
let mut compiler = Compiler::new();
let source = r#"
<template>
<div>{{ count }}</div>
</template>
<script>
const [count, setCount] = createSignal(0);
watch(count, (newVal, oldVal) => {
console.log('Count changed:', newVal, oldVal);
});
</script>
"#;
let result = compiler.compile("WatchComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'WatchComp'"));
assert!(js.code.contains("watch(count, (newVal, oldVal) =>"));
}
#[test]
fn test_compiler_compile_with_lifecycle_hooks() {
let mut compiler = Compiler::new();
let source = r#"
<template>
<div>Component</div>
</template>
<script>
onMounted(() => {
console.log('Component mounted');
});
onUnmounted(() => {
console.log('Component unmounted');
});
</script>
"#;
let result = compiler.compile("LifecycleComp", source);
assert!(result.is_ok());
let js = result.unwrap();
assert!(js.code.contains("export default {"));
assert!(js.code.contains("name: 'LifecycleComp'"));
assert!(js.code.contains("onMounted(() =>"));
assert!(js.code.contains("onUnmounted(() =>"));
}