@@ -25,9 +25,13 @@ class lime_test
2525 protected $ options = array ();
2626
2727 static protected $ all_results = array ();
28+ static private $ instanceCount = 0 ;
29+ static private $ allExitCode = 0 ;
2830
2931 public function __construct ($ plan = null , $ options = array ())
3032 {
33+ ++self ::$ instanceCount ;
34+
3135 // for BC
3236 if (!is_array ($ options ))
3337 {
@@ -131,6 +135,8 @@ static public function to_xml($results = null)
131135
132136 public function __destruct ()
133137 {
138+ --self ::$ instanceCount ;
139+
134140 $ plan = $ this ->results ['stats ' ]['plan ' ];
135141 $ passed = count ($ this ->results ['stats ' ]['passed ' ]);
136142 $ failed = count ($ this ->results ['stats ' ]['failed ' ]);
@@ -156,6 +162,31 @@ public function __destruct()
156162 }
157163
158164 flush ();
165+
166+ self ::$ allExitCode |= $ this ->getExitCode ();
167+
168+ if (0 === self ::$ instanceCount ) {
169+ exit (self ::$ allExitCode );
170+ }
171+ }
172+
173+ private function getExitCode ()
174+ {
175+ $ plan = $ this ->results ['stats ' ]['plan ' ];
176+ $ failed = count ($ this ->results ['stats ' ]['failed ' ]);
177+ $ total = $ this ->results ['stats ' ]['total ' ];
178+ is_null ($ plan ) and $ plan = $ total and $ this ->output ->echoln (sprintf ("1..%d " , $ plan ));
179+
180+ if ($ failed )
181+ {
182+ return 1 ;
183+ }
184+ else if ($ total == $ plan )
185+ {
186+ return 0 ;
187+ }
188+
189+ return 1 ;
159190 }
160191
161192 /**
0 commit comments