File: cycle.rs

package info (click to toggle)
rust-swc-core 35.0.0~ds-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 62,816 kB
  • sloc: javascript: 873; xml: 538; sh: 358; makefile: 35; python: 5
file content (64 lines) | stat: -rw-r--r-- 1,340 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use swc_graph_analyzer::{DepGraph, GraphAnalyzer};

struct Deps<'a> {
    deps: &'a [(usize, Vec<usize>)],
}

impl DepGraph for Deps<'_> {
    type ModuleId = usize;

    fn deps_of(&self, module_id: Self::ModuleId) -> Vec<Self::ModuleId> {
        self.deps
            .iter()
            .find_map(|(id, deps)| {
                if *id == module_id {
                    Some(deps.clone())
                } else {
                    None
                }
            })
            .unwrap()
    }
}

fn assert_cycles(deps: &[(usize, Vec<usize>)], cycles: Vec<Vec<usize>>) {
    let _logger = testing::init();

    {
        let mut analyzer = GraphAnalyzer::new(Deps { deps });

        analyzer.load(0);

        let res = analyzer.into_result();

        assert_eq!(res.cycles, cycles);
    }

    {
        // Ensure that multiple load does not affect cycle detection.

        let mut analyzer = GraphAnalyzer::new(Deps { deps });

        for idx in 0..deps.len() {
            analyzer.load(idx);
        }

        let res = analyzer.into_result();

        assert_eq!(res.cycles, cycles);
    }
}

#[test]
fn stc_1() {
    assert_cycles(
        &[
            (0, vec![2]),
            (1, Vec::new()),
            (2, vec![1]),
            (3, vec![0]),
            (4, vec![2, 3]),
        ],
        Vec::new(),
    );
}