Öffentliche API zur MathCoach-IDE
Hong-Phuc Bui
2023-05-17 21b84e668b368fff8b90193000402c664850255d
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import test, { ExecutionContext } from "ava";
 
import { Helpers } from "@mathcoach-ide-api";
import { MathCoach } from "@mathcoach-ide-api";
 
 
test("Helpers.contextFileToExerciseFile works as expected", t => {
    t.deepEqual(
        Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "/a/b/aufgabe.tool.json" }),
        { owner: "demo", part: "vfs", path: "/a/b/aufgabe.groovy" } as MathCoach.File
    );
    t.deepEqual(
        Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "/a/b/aufgabe.json" }),
        { owner: "demo", part: "vfs", path: "/a/b/aufgabe.groovy" } as MathCoach.File
    );
    t.deepEqual(
        Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "/aufgabe.tool.json" }),
        { owner: "demo", part: "vfs", path: "/aufgabe.groovy" } as MathCoach.File
    );
    t.deepEqual(
        Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "/aufgabe.json" }),
        { owner: "demo", part: "vfs", path: "/aufgabe.groovy" } as MathCoach.File
    );
})
 
test("Helpers.contextFileToExerciseFile check params", t => {
    const expected = { message: "no valid file reference given, expected object like {owner:'demo', part:'vfs'|'www', path: '/...'}" }
    t.throws(() => Helpers.contextFileToExerciseFile(null as any), expected);
    t.throws(() => Helpers.contextFileToExerciseFile("null" as any), expected);
    t.throws(() => Helpers.contextFileToExerciseFile({ owner: 1, part: 2, path: 3 } as any), expected);
    t.throws(() => Helpers.contextFileToExerciseFile({ owner: "", part: "vfs", path: "/aufgabe.tool.json" } as any), expected);
    t.throws(() => Helpers.contextFileToExerciseFile({ owner: "demo", part: "xxx", path: "/aufgabe.tool.json" } as any), expected);
    t.throws(() => Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "notAbsolute.tool.json" } as any), expected);
})
 
test("Helpers.isFile", t => {
    t.true(Helpers.isFile({ owner: "demo1", part: "vfs", path: "/aufgabe.json" }))
    t.true(Helpers.isFile({ owner: "demo2", part: "www", path: "/b/aufgabe.json" }))
    t.true(Helpers.isFile({ owner: "demo3", part: "vfs", path: "/" }))
 
    t.false(Helpers.isFile(undefined))
    t.false(Helpers.isFile({}))
    t.false(Helpers.isFile("test"))
 
    t.false(Helpers.isFile({ owner: "demo", part: "xxx", path: "/aufgabe.json" })) // bad part
    t.false(Helpers.isFile({ owner: "demo", part: 42, path: "/aufgabe.json" })) // bad part
    t.false(Helpers.isFile({ owner: "demo", path: "/aufgabe.json" })) // bad part
 
 
    t.false(Helpers.isFile({ owner: "demo", part: "www", path: "noAbsolutePath.json" })) // bad path
    t.false(Helpers.isFile({ owner: "demo", part: "www", path: "" })) // bad path
    t.false(Helpers.isFile({ owner: "demo", part: "www", path: 42 })) // bad path
    t.false(Helpers.isFile({ owner: "demo", part: "www" })) // bad path
 
    t.false(Helpers.isFile({ owner: undefined, part: "vfs", path: "/" })) // bad owner
    t.false(Helpers.isFile({ owner: 42, part: "vfs", path: "/" })) // bad owner
    t.false(Helpers.isFile({ part: "vfs", path: "/" })) // bad owner
})
 
 
test("Helpers.createStorageBasedApi() MC.isReady", async t => {
    const MC = Helpers.createStorageBasedApi();
    t.true(await MC.isReady());
})
 
test("Helpers.createStorageBasedApi() MC.ide.getContextFile", async t => {
    const MC = Helpers.createStorageBasedApi();
    const contextFile = await MC.ide.getContextFile()
    t.true(Helpers.isFile(contextFile));
    t.is(contextFile.owner, "jdoe");
    t.is(contextFile.part, "vfs");
    t.is(contextFile.path, "/file.dummy.json");
})
 
test("Helpers.createStorageBasedApi() MC.ide.getUserName", async t => {
    const MC = Helpers.createStorageBasedApi();
    t.is(await MC.ide.getUserName(), "jdoe");
})
 
async function expectThrows(t: ExecutionContext, callback: () => Promise<any>) {
    try {
        await callback();
        t.fail()
    } catch (error) {
        t.pass()
    }
}
 
test("Helpers.createStorageBasedApi() MC.ide.fs readFile+writeFile", async t => {
    const MC = Helpers.createStorageBasedApi(); // expect InMemory Storage
    const contextFile = await MC.ide.getContextFile();
    const exerciseFile = Helpers.contextFileToExerciseFile(contextFile);
 
    t.is(await MC.ide.fs.readFile(contextFile), "");
    t.is(await MC.ide.fs.readFile(exerciseFile), "");
 
    await MC.ide.fs.writeFile(contextFile, "123");
    await MC.ide.fs.writeFile(exerciseFile, "456");
 
    t.is(await MC.ide.fs.readFile(contextFile), "123");
    t.is(await MC.ide.fs.readFile(exerciseFile), "456");
 
    expectThrows(t, () => MC.ide.fs.writeFile({} as any, ""));
    expectThrows(t, () => MC.ide.fs.writeFile(exerciseFile, 42 as any));
    expectThrows(t, () => MC.ide.fs.writeFile(null as any, null as any));
})
 
test("Helpers.createStorageBasedApi() MC.ide.navigator", async t => {
    const MC = Helpers.createStorageBasedApi();
    const contextFile = await MC.ide.getContextFile();
    const exerciseFile = Helpers.contextFileToExerciseFile(contextFile);
 
    MC.ide.navigator.navigateTo("www.google.de");
    MC.ide.navigator.navigateToExercise(exerciseFile);
    MC.ide.navigator.navigateTo("www.google.de", true);
    MC.ide.navigator.navigateToExercise(exerciseFile, true);
    MC.ide.navigator.navigateTo("www.google.de", false);
    MC.ide.navigator.navigateToExercise(exerciseFile, false);
 
    expectThrows(t, () => MC.ide.navigator.navigateTo(null as any));
    expectThrows(t, () => MC.ide.navigator.navigateTo(42 as any));
    expectThrows(t, () => MC.ide.navigator.navigateTo("www.google.de", 42 as any));
 
    t.pass();
})