Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/utils/lib/test/runner.js
blob: 1bdb43ceed5d477d3e2ddef836fb97b64ccad510 (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
var util = require('util');
var assert = require("./assert");

exports.run = function(objectOrModule, context) {

    if (typeof objectOrModule === "string")
        objectOrModule = require(objectOrModule);

    if (!objectOrModule)
        throw "Nothing to run";

    var localContext = context || { passed : 0, failed : 0, error : 0, depth : 0 };
    localContext.depth++;
    
    for (var spaces=""; spaces.length < localContext.depth * 2; spaces += "  ");
    
    for (var property in objectOrModule) {
        if (property.match(/^test/)) {
            print(spaces + "+ Running "+property);
            if (typeof objectOrModule[property] == "function") {
                if (typeof objectOrModule.setup === "function")
                    objectOrModule.setup();

                var globals = {};
                for (var name in system.global) {
                    globals[name] = true;
                }

                try {
                    try {
                        objectOrModule[property]();
                    } finally {
                        if (!objectOrModule.isMonkey) {
                            for (var name in system.global) {
                                if (!globals[name]) {
                                    delete system.global[name];
                                    throw new assert.AssertionError("New global introduced: " + util.enquote(name));
                                }
                            }
                        }
                    }

                    localContext.passed++;
                } catch (e) {
                    if (e.name === "AssertionError") {
                        print("Assertion Failed in "+property+": " + e);
                        
                        if (e.rhinoException)
                            e.rhinoException.printStackTrace();
                        else if (e.javaException)
                            e. javaException.printStackTrace();
                        
                        localContext.failed++;
                    } else {
                        print("Exception in "+property+": " + e);
                        
                        if (e.rhinoException)
                            e.rhinoException.printStackTrace();
                        else if (e.javaException)
                            e. javaException.printStackTrace();
                        
                        localContext.error++;
                    }
                } finally {
                    if (typeof objectOrModule.teardown === "function")
                        objectOrModule.teardown();
                }
            } else {
                exports.run(objectOrModule[property], localContext);
            }
        }
    }
    
    localContext.depth--;

    if (context === undefined)
        print("Passed "+localContext.passed+"; Failed "+localContext.failed+"; Error "+localContext.error+";");

    return localContext.failed + localContext.error;
};