1 package fit;
2
3 import java.util.HashMap;
4 import java.util.Stack;
5
6 public class ContextFixture extends Fixture
7 {
8
9 private static HashMap<String, Fixture> contexts = new HashMap<String, Fixture>();
10
11 private static Stack<String> activeContextStack = new Stack<String>();
12
13 @Override
14 public void doCells(Parse cells)
15 {
16 if (cells.text().equals("begin context"))
17 {
18 beginContext(cells);
19 }
20 else if (cells.text().equals("complete context"))
21 {
22 completeContext(cells);
23 }
24 else if (cells.text().equals("select context"))
25 {
26 selectContext(cells);
27 }
28 else
29 {
30 Fixture fixture = getActiveFixture();
31 fixture.doCells(cells);
32 }
33 }
34
35 public void beginContext(Parse cells)
36 {
37 String context = cells.more.text();
38 String fixtureName = cells.more.more.text();
39 try
40 {
41 Fixture fixture = (Fixture) getClass().forName(fixtureName).newInstance();
42 fixture.counts = this.counts;
43
44 activeContextStack.push(context);
45 contexts.put(context, fixture);
46 right(cells);
47 right(cells.more);
48 right(cells.more.more);
49 }
50 catch (Exception e)
51 {
52 exception(cells, e);
53 }
54 }
55
56 public void selectContext(Parse cells)
57 {
58 String context = cells.more.text();
59 activeContextStack.remove(context);
60 activeContextStack.push(context);
61 right(cells);
62 right(cells.more);
63 }
64
65 public void completeContext(Parse cells)
66 {
67 String context = cells.more.text();
68 if (activeContextStack.lastElement().equals(context))
69 {
70 String active = activeContextStack.pop();
71 Fixture fixture = contexts.remove(active);
72 right(cells);
73 right(cells.more);
74 counts.right += fixture.counts.right;
75 counts.wrong += fixture.counts.wrong;
76 counts.ignores += fixture.counts.ignores;
77 counts.exceptions += fixture.counts.ignores;
78 }
79 else
80 {
81 wrong(cells, "Wrong context, the context is not active!");
82 }
83 }
84
85 protected Fixture getActiveFixture()
86 {
87 String activeContext = activeContextStack.lastElement();
88 Fixture fixture = contexts.get(activeContext);
89 return fixture;
90 }
91
92 }