summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py
blob: bff3b675b04d144deeab5e03789918fece8e0fae (plain)
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
#! /usr/bin/env python3
import pathlib
import re
import sys

assert len(sys.argv) == 2
MOCHI_PATH = pathlib.Path(sys.argv[1])
assert MOCHI_PATH.suffix == ".html"

TEST_PATH = MOCHI_PATH.with_suffix(".solo.html")


def read_local_file(include):
    inc_path = MOCHI_PATH.parent
    file_path = inc_path / include

    try:
        return file_path.read_bytes()
    except IOError:
        return b""


SIMPLETEST_REPLACEMENT = b"""

<script>
// SimpleTest.js replacement

function debug(text) {
  var elem = document.getElementById('mochi-to-testcase-output');
  elem.innerHTML += '\\n<br/>\\n' + text;
}

function ok(val, text) {
  var status = val ? 'Test <font color=\\'green\\'>passed</font>: '
                   : 'Test <font color=\\'red\\'  >FAILED</font>: ';
  debug(status + text);
}

function todo(val, text) {
  var status = val ? 'Test <font color=\\'orange\\'>UNEXPECTED PASS</font>: '
                   : 'Test <font color=\\'blue\\'  >todo</font>: ';
  debug(status + text);
}

function addLoadEvent(func) {
  window.addEventListener('load', func);
}

SimpleTest = {
  waitForExplicitFinish: () => {},
  finish: () => {},
  requestFlakyTimeout: () => {},
};

SpecialPowers = {
  pushPrefEnv: async (env, callback = null) => {
    console.log(`SpecialPowers.pushPrefEnv(${JSON.stringify(env)})`);
    await new Promise(res => {
        setTimeout(res, 0);
    });
    if (callback) {
        await callback();
    }
  },
  popPrefEnv: async (callback = null) => {
    console.log('SpecialPowers.popPrefEnv()');
    await new Promise(res => {
        setTimeout(res, 0);
    });
    if (callback) {
        await callback();
    }
  },
};
</script>
<div id='mochi-to-testcase-output'></div>

"""

INCLUDE_PATTERN = re.compile(b"<script\\s*src=['\"](.*)\\.js['\"]>\\s*</script>")
CSS_PATTERN = re.compile(
    b"<link\\s*rel=['\"]stylesheet['\"]\\s*href=['\"]([^=>]*)['\"]>"
)

with open(TEST_PATH, "wb") as fout:
    with open(MOCHI_PATH, "rb") as fin:
        for line in fin:
            skip_line = False
            for css in CSS_PATTERN.findall(line):
                skip_line = True
                print("Ignoring stylesheet: " + css.decode())

            for inc in INCLUDE_PATTERN.findall(line):
                skip_line = True
                if inc == b"/MochiKit/MochiKit":
                    continue

                if inc == b"/tests/SimpleTest/SimpleTest":
                    print("Injecting SimpleTest replacement")
                    fout.write(SIMPLETEST_REPLACEMENT)
                    continue

                inc_js = inc.decode() + ".js"
                inc_data = read_local_file(inc_js)
                if not inc_data:
                    print("Warning: Unknown JS file ignored: " + inc_js)
                    continue

                print("Injecting include: " + inc_js)
                fout.write(b"\n<script>\n// Imported from: " + inc_js.encode() + b"\n")
                fout.write(inc_data)
                fout.write(b"\n</script>\n")
                continue

            if skip_line:
                continue

            fout.write(line)
            continue