aboutsummaryrefslogtreecommitdiff
path: root/src/rt/test
diff options
context:
space:
mode:
authorMichael Bebenita <[email protected]>2010-09-07 18:26:19 -0700
committerMichael Bebenita <[email protected]>2010-09-07 18:41:08 -0700
commita6aebdaedd4abb95b040c9cd09cfdb6b9b940789 (patch)
treec143ba57b7ac8cf5a93f6871abb8a496f50e6fe6 /src/rt/test
parentSmall updates to util classes. (diff)
downloadrust-a6aebdaedd4abb95b040c9cd09cfdb6b9b940789.tar.xz
rust-a6aebdaedd4abb95b040c9cd09cfdb6b9b940789.zip
Started work on a framework for writing runtime tests, added some simple test cases.
Diffstat (limited to 'src/rt/test')
-rw-r--r--src/rt/test/rust_test_harness.cpp37
-rw-r--r--src/rt/test/rust_test_harness.h22
-rw-r--r--src/rt/test/rust_test_util.cpp78
-rw-r--r--src/rt/test/rust_test_util.h43
4 files changed, 180 insertions, 0 deletions
diff --git a/src/rt/test/rust_test_harness.cpp b/src/rt/test/rust_test_harness.cpp
new file mode 100644
index 00000000..c33e170e
--- /dev/null
+++ b/src/rt/test/rust_test_harness.cpp
@@ -0,0 +1,37 @@
+#include "../rust_internal.h"
+
+bool
+rust_test::run() {
+ return false;
+}
+
+const char *
+rust_test::name() {
+ return "untitled";
+}
+
+rust_test_suite::rust_test_suite() {
+ tests.append(new rust_array_list_test());
+ tests.append(new rust_synchronized_indexed_list_test());
+}
+
+rust_test_suite::~rust_test_suite() {
+
+}
+
+bool
+rust_test_suite::run() {
+ bool pass = true;
+ for (size_t i = 0; i < tests.size(); i++) {
+ rust_test *test = tests[i];
+ printf("test: %s running ... \n", test->name());
+ if (tests[i]->run() == false) {
+ printf("test: %s FAILED\n", test->name());
+ pass = false;
+ } else {
+ printf("test: %s PASSED\n", test->name());
+ }
+ }
+ return pass;
+}
+
diff --git a/src/rt/test/rust_test_harness.h b/src/rt/test/rust_test_harness.h
new file mode 100644
index 00000000..401015e4
--- /dev/null
+++ b/src/rt/test/rust_test_harness.h
@@ -0,0 +1,22 @@
+#ifndef RUST_TEST_HARNESS_H
+#define RUST_TEST_HARNESS_H
+
+#define CHECK(x) if ((x) == false) \
+ { printf("condition: %s failed at file: %s, line: %d\n", #x, \
+ __FILE__, __LINE__ ); return false; }
+
+class rust_test {
+public:
+ virtual bool run();
+ virtual const char *name();
+};
+
+class rust_test_suite : public rust_test {
+public:
+ array_list<rust_test*> tests;
+ rust_test_suite();
+ virtual ~rust_test_suite();
+ bool run();
+};
+
+#endif /* RUST_TEST_HARNESS_H */
diff --git a/src/rt/test/rust_test_util.cpp b/src/rt/test/rust_test_util.cpp
new file mode 100644
index 00000000..76bd7990
--- /dev/null
+++ b/src/rt/test/rust_test_util.cpp
@@ -0,0 +1,78 @@
+#include "../rust_internal.h"
+
+#define COUNT 1000
+#define LARGE_COUNT 100000
+#define THREADS 10
+
+bool
+rust_array_list_test::run() {
+ array_list<int> list;
+
+ for (int i = 0; i < COUNT; i++) {
+ list.append(i);
+ }
+
+ for (int i = 0; i < COUNT; i++) {
+ CHECK (list[i] == i);
+ }
+
+ for (int i = 0; i < COUNT; i++) {
+ CHECK (list.index_of(i) == i);
+ }
+
+ for (int i = 0; i < COUNT; i++) {
+ CHECK (list.replace(i, -i));
+ CHECK (list.replace(-i, i));
+ CHECK (list.index_of(i) == i);
+ }
+
+ for (int i = COUNT - 1; i >= 0; i--) {
+ CHECK (list.pop(NULL));
+ }
+
+ return true;
+}
+
+bool
+rust_synchronized_indexed_list_test::run() {
+ array_list<worker*> workers;
+
+ for (int i = 0; i < THREADS; i++) {
+ worker *worker =
+ new rust_synchronized_indexed_list_test::worker(this);
+ workers.append(worker);
+ }
+
+ for (uint32_t i = 0; i < workers.size(); i++) {
+ workers[i]->start();
+ }
+
+ while(workers.is_empty() == false) {
+ worker *worker;
+ workers.pop(&worker);
+ worker->join();
+ delete worker;
+ }
+
+ long long expected_items = LARGE_COUNT * THREADS;
+
+ CHECK(list.length() == expected_items);
+
+ long long sum = 0;
+ for (size_t i = 0; i < list.length(); i++) {
+ sum += list[i]->value;
+ }
+
+ long long expected_sum = LARGE_COUNT;
+ expected_sum = expected_sum * (expected_sum - 1) / 2 * THREADS;
+ CHECK (sum == expected_sum);
+ return true;
+}
+
+void
+rust_synchronized_indexed_list_test::worker::run() {
+ for (int i = 0; i < LARGE_COUNT; i++) {
+ parent->list.append(new indexed_list_element<int>(i));
+ }
+ return;
+}
diff --git a/src/rt/test/rust_test_util.h b/src/rt/test/rust_test_util.h
new file mode 100644
index 00000000..fb8490cb
--- /dev/null
+++ b/src/rt/test/rust_test_util.h
@@ -0,0 +1,43 @@
+#ifndef RUST_TEST_UTIL_H
+#define RUST_TEST_UTIL_H
+
+class rust_test_util : public rust_test {
+public:
+
+};
+
+class rust_array_list_test : public rust_test {
+public:
+ bool run();
+ const char *name() {
+ return "rust_array_list_test";
+ }
+};
+
+
+class rust_synchronized_indexed_list_test : public rust_test {
+public:
+ rust_srv srv;
+ memory_region region;
+ synchronized_indexed_list<indexed_list_element<int> > list;
+
+ rust_synchronized_indexed_list_test() :
+ region(&srv, false), list(&region) {
+ // Nop.
+ }
+
+ class worker : public rust_thread {
+ public:
+ rust_synchronized_indexed_list_test *parent;
+ worker(rust_synchronized_indexed_list_test *parent) : parent(parent) {
+ // Nop.
+ }
+ void run();
+ };
+ bool run();
+ const char *name() {
+ return "rust_synchronized_indexed_list_test";
+ }
+};
+
+#endif /* RUST_TEST_UTIL_H */