package com.graphtest;

import com.graphtest.model.NodeStatus;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;

import static org.assertj.core.api.Assertions.*;

@DisplayName("Case 6: Syntax Error trong file nguồn")
class Case6_SyntaxErrorTest {

    private CodeGraph graph;

    @BeforeEach
    void setUp() throws Exception {
        URL resource = getClass().getClassLoader().getResource("fixtures/case6_syntax_error");
        Path dir = Paths.get(resource.toURI());
        graph = new GraphBuilder().buildFromDirectory(dir);
    }

    @Test
    @DisplayName("Graph phải build thành công, không crash với syntax error")
    void graphShouldNotCrashOnSyntaxError() {
        assertThat(graph).isNotNull();
    }

    @Test
    @DisplayName("Node cho file bị lỗi vẫn phải được tạo")
    void nodeForBrokenFileShouldExist() {
        assertThat(graph.hasNode("BrokenClass")).isTrue();
    }

    @Test
    @DisplayName("Node phải được đánh dấu SYNTAX_ERROR status")
    void brokenNodeShouldHaveSyntaxErrorStatus() {
        assertThat(graph.getNode("BrokenClass").getStatus()).isEqualTo(NodeStatus.SYNTAX_ERROR);
    }

    @Test
    @DisplayName("Phải có build error chứa tên file bị lỗi")
    void shouldReportBuildErrorWithFileName() {
        assertThat(graph.getBuildErrors()).isNotEmpty();
        assertThat(graph.getBuildErrors().get(0)).contains("BrokenClass");
    }

    @Test
    @DisplayName("File bị lỗi không có outgoing edges")
    void brokenFileShouldHaveNoEdges() {
        assertThat(graph.getOutgoingEdges("BrokenClass")).isEmpty();
    }
}
