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 5: File không tồn tại được import")
class Case5_MissingImportTest {

    private CodeGraph graph;

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

    @Test
    @DisplayName("Graph phải build thành công dù có missing import")
    void graphShouldBuildDespiteMissingImport() {
        assertThat(graph).isNotNull();
        assertThat(graph.hasNode("UseMissing")).isTrue();
    }

    @Test
    @DisplayName("Node gốc phải có status OK")
    void sourceNodeShouldHaveOkStatus() {
        assertThat(graph.getNode("UseMissing").getStatus()).isEqualTo(NodeStatus.OK);
    }

    @Test
    @DisplayName("Node của class bị thiếu phải được tạo với status MISSING")
    void missingNodeShouldBeCreatedWithMissingStatus() {
        assertThat(graph.hasNode("GhostClass")).isTrue();
        assertThat(graph.getNode("GhostClass").getStatus()).isEqualTo(NodeStatus.MISSING);
    }

    @Test
    @DisplayName("Edge tới class bị thiếu vẫn phải được tạo")
    void edgeToMissingNodeShouldExist() {
        assertThat(graph.hasEdge("UseMissing", "GhostClass")).isTrue();
    }

    @Test
    @DisplayName("Build process không bị dừng bởi missing import")
    void buildShouldContinueDespiteMissingImport() {
        assertThat(graph.getNodesByStatus(NodeStatus.OK)).hasSize(1);
        assertThat(graph.getNodesByStatus(NodeStatus.MISSING)).hasSize(1);
    }
}
