Allow separate line and dot colors
[capillary:capillary-js.git] / test / capillary / formatters / raphael-test.js
1 /* encoding: utf-8
2  *--
3  *   Copyright (C) 2011 Gitorious AS
4  *
5  *   This program is free software: you can redistribute it and/or modify
6  *   it under the terms of the GNU Affero General Public License as published by
7  *   the Free Software Foundation, either version 3 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *   GNU Affero General Public License for more details.
14  *
15  *   You should have received a copy of the GNU Affero General Public License
16  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *++
18  */
19 if (typeof require == "function") {
20     var buster = require("buster");
21     var capillary = require("../../../lib/capillary");
22     capillary.formatters = require("../../../lib/capillary/formatters");
23 }
24
25 function setAttributes(attributes) {
26     for (var attr in attributes) {
27         this[attr] = attributes[attr];
28     }
29
30     return this;
31 }
32
33 var fakeRaphael = {
34     create: function () {
35         var canvas = buster.create(this);
36         canvas.circles = [];
37         this.paths = [];
38
39         return canvas;
40     },
41
42     circle: function (x, y, r) {
43         var circleData = { x: x, y: y, r: r, attr: setAttributes };
44         this.circles.push(circleData);
45
46         return circleData;
47     },
48
49     path: function (path) {
50         var pathData = { path: path, attr: setAttributes };
51         this.paths.push(pathData);
52
53         return pathData;
54     }
55 };
56
57 var assert = buster.assert;
58 var refute = buster.refute;
59 var F = capillary.formatters;
60
61 buster.testCase("Raphael formatter", {
62     setUp: function () {
63         this.canvas = fakeRaphael.create();
64         this.graph = buster.eventEmitter.create();
65
66         this.formatter = F.raphael.bindGraph(F.svgData.bindGraph(this.graph), {
67             dotRadius: 3,
68             canvas: this.canvas
69         });
70     },
71
72     "should draw circle": function () {
73         this.graph.emit("graph:dot", [0, 1], {}, {});
74
75         assert.match(this.canvas.circles, [{ x: 0, y: 1, r: 3 }]);
76     },
77
78     "should use color fill circle": function () {
79         this.formatter.dotColors = ["#000"];
80         this.graph.emit("graph:dot", [0, 1], {}, { id: 0 });
81
82         assert.equals(this.canvas.circles[0].fill, "#000");
83     },
84
85     "should use different colors for different branches": function () {
86         this.formatter.dotColors = ["#000", "#f0f0f0"];
87         this.graph.emit("graph:dot", [0, 1], {}, { id: 0 });
88         this.graph.emit("graph:dot", [1, 1], {}, { id: 1 });
89
90         assert.equals(this.canvas.circles[0].fill, "#000");
91         assert.equals(this.canvas.circles[1].fill, "#f0f0f0");
92     },
93
94     "should use cycle colors when more branches than colors": function () {
95         this.formatter.dotColors = ["#ff0020", "#f0f0f0"];
96         this.graph.emit("graph:dot", [0, 1], {}, { id: 0 });
97         this.graph.emit("graph:dot", [1, 1], {}, { id: 1 });
98         this.graph.emit("graph:dot", [2, 1], {}, { id: 2 });
99         this.graph.emit("graph:dot", [3, 1], {}, { id: 3 });
100
101         assert.equals(this.canvas.circles[2].fill, "#ff0020");
102         assert.equals(this.canvas.circles[3].fill, "#f0f0f0");
103     },
104
105     "should not color fill circle when no branch id": function () {
106         this.formatter.dotColors = ["#ff0020", "#f0f0f0"];
107         this.graph.emit("graph:dot", [0, 1], {}, {});
108
109         refute("fill" in this.canvas.circles[0]);
110     },
111
112     "should accept colors with bind": function () {
113         var canvas = fakeRaphael.create();
114         var graph = buster.eventEmitter.create();
115         var formatter = F.raphael.bindGraph(F.svgData.bindGraph(graph), {
116             canvas: canvas,
117             dotColors: ["#0f0", "#00f"]
118         });
119
120         graph.emit("graph:dot", [0, 1], {}, { id: 0 });
121         graph.emit("graph:dot", [1, 1], {}, { id: 1 });
122
123         assert.equals(canvas.circles[0].fill, "#0f0");
124         assert.equals(canvas.circles[1].fill, "#00f");
125     },
126
127     "should only draw merge commits once for the merged-onto branch": function () {
128         this.formatter.dotColors = ["#ff0020", "#f0f0f0"];
129         this.graph.emit("graph:dot", [0, 1], {}, { id: 0 });
130         this.graph.emit("graph:dot", [0, 1], {}, { id: 1 });
131
132         assert.equals(this.canvas.circles.length, 1);
133         assert.equals(this.canvas.circles[0].fill, "#ff0020");
134     },
135
136     "should draw line": function () {
137         this.graph.emit("graph:line", [[0,0], [0,1]], {});
138
139         assert.match(this.canvas.paths, [{ path: "M0 0L0 1" }]);
140     },
141
142     "should default line color to #aaa": function () {
143         this.graph.emit("graph:line", [[0,0], [0,1]], { id: 0 });
144         this.graph.emit("graph:line", [[0,1], [0,2]], { id: 1 });
145
146         assert.equals(this.canvas.paths[0].stroke, "#aaa");
147         assert.equals(this.canvas.paths[1].stroke, "#aaa");
148     },
149
150     "should use specified line color": function () {
151         this.formatter.lineColors = ["#ccc"];
152         this.graph.emit("graph:line", [[0,0], [0,1]], { id: 0 });
153         this.graph.emit("graph:line", [[0,1], [0,2]], { id: 1 });
154
155         assert.equals(this.canvas.paths[0].stroke, "#ccc");
156         assert.equals(this.canvas.paths[1].stroke, "#ccc");
157     },
158
159     "should use specified line colors": function () {
160         this.formatter.lineColors = ["#ccc", "#bdbdbd"];
161         this.graph.emit("graph:line", [[0,0], [0,1]], { id: 0 });
162         this.graph.emit("graph:line", [[0,1], [0,2]], { id: 1 });
163
164         assert.equals(this.canvas.paths[0].stroke, "#ccc");
165         assert.equals(this.canvas.paths[1].stroke, "#bdbdbd");
166     }
167 });