nargo-compiler 0.0.0

Nargo compiler core
Documentation
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(() =>"));
}