2 using System
.Reflection
;
3 using System
.Collections
.Generic
;
5 public class CategoryAttribute
: Attribute
7 public CategoryAttribute (string category
) {
11 public string Category
{
16 public class TestDriver
{
18 static public int RunTests (Type type
, string[] args
) {
19 int failed
= 0, ran
= 0;
24 bool do_timings
= false;
27 DateTime start
, end
= DateTime
.Now
;
31 var exclude
= new Dictionary
<string, string> ();
32 List
<string> run_only
= new List
<string> ();
33 if (args
!= null && args
.Length
> 0) {
34 for (j
= 0; j
< args
.Length
;) {
35 if (args
[j
] == "--time") {
38 } else if (args
[j
] == "--iter") {
39 iterations
= Int32
.Parse (args
[j
+ 1]);
41 } else if ((args
[j
] == "-v") || (args
[j
] == "--verbose")) {
43 } else if (args
[j
] == "--exclude") {
44 exclude
[args
[j
+ 1]] = args
[j
+ 1];
46 } else if (args
[j
] == "--run-only") {
47 run_only
.Add (args
[j
+ 1]);
50 Console
.WriteLine ("Unknown argument: " + args
[j
]);
56 methods
= type
.GetMethods (BindingFlags
.Public
|BindingFlags
.NonPublic
|BindingFlags
.Static
);
57 for (int iter
= 0; iter
< iterations
; ++iter
) {
58 for (i
= 0; i
< methods
.Length
; ++i
) {
59 name
= methods
[i
].Name
;
60 if (!name
.StartsWith ("test_", StringComparison
.Ordinal
))
62 if (run_only
.Count
> 0) {
64 for (j
= 0; j
< run_only
.Count
; j
++) {
65 if (name
.EndsWith (run_only
[j
])) {
73 if (exclude
.Count
> 0) {
74 var attrs
= methods
[i
].GetCustomAttributes (typeof (CategoryAttribute
), false);
76 foreach (CategoryAttribute attr
in attrs
) {
77 if (exclude
.ContainsKey (attr
.Category
))
82 Console
.WriteLine ("Skipping '{0}'.", name
);
87 for (j
= 5; j
< name
.Length
; ++j
)
88 if (!Char
.IsDigit (name
[j
]))
91 Console
.WriteLine ("Running '{0}' ...", name
);
92 expected
= Int32
.Parse (name
.Substring (5, j
- 5));
94 result
= (int)methods
[i
].Invoke (null, null);
97 long tdiff
= end
.Ticks
- start
.Ticks
;
98 int mdiff
= (int)tdiff
/10000;
100 Console
.WriteLine ("{0} took {1} ms", name
, mdiff
);
103 if (result
!= expected
) {
105 Console
.WriteLine ("{0} failed: got {1}, expected {2}", name
, result
, expected
);
110 Console
.WriteLine ("Total ms: {0}", tms
);
113 Console
.WriteLine ("Regression tests: {0} ran, {1} skipped, {2} failed in {3}", ran
, nskipped
, failed
, type
);
115 Console
.WriteLine ("Regression tests: {0} ran, {1} failed in {2}", ran
, failed
, type
);
118 //Console.WriteLine ("Regression tests: {0} ran, {1} failed in [{2}]{3}", ran, failed, type.Assembly.GetName().Name, type);
121 static public int RunTests (Type type
) {
122 return RunTests (type
, null);