OSDN Git Service

-lexeme_idを、private inherit Enum idiomで書き直した。なんかよくわからないエラーが出るけど気にしない。
[simplecms/utakata.git] / simpletest.cpp
1 #include <vector>
2 #include <iostream>
3 #include <string>
4 #include <algorithm>
5
6 #include "simpletest.h"
7
8 using namespace simpletest;
9
10 SimpleTestSuite::SimpleTestSuite(const std::string& name) :
11     name_("[" + name + "]"), prefix_("*"), testers_(), strm_(std::cout),
12     runner_()
13 {
14     runner_.add(new SimpleTestRunner(strm_, prefix_));
15 }
16
17 SimpleTestSuite::SimpleTestSuite(const std::string& name,
18                                    std::ostream& strm) :
19     name_("[" + name + "]"), prefix_("*"), testers_(), strm_(strm)
20 {
21     runner_.add(new SimpleTestRunner(strm_, prefix_));
22 }
23
24 bool SimpleTestSuite::addTester(const sfcr::sfc_r<bool>::type& func)
25 {
26     // テストを追加する。中身がNULLの場合には触らない。
27     if (func.isNull())
28     {
29         return false;
30     }
31     testers_.push_back(func);
32     return true;
33 }
34
35 void SimpleTestSuite::run()
36 {
37     // この場合、標準出力される、std::coutが利用される。
38     // 現在保持しているテストをまとめて実行する。
39     // 実行した結果は、全て出力されるようになる。
40     
41     printBeginMessage();
42
43     SimpleTestRunner runner(strm_, prefix_);
44     std::for_each(testers_.begin(), testers_.end(),
45                   *runner_);
46
47     printEndMessage();
48 }
49
50 void simpletest::SimpleTestSuite::printBeginMessage()
51 {
52     // 開始メッセージを、指定されたストリームに出力する。
53
54     const std::string separates("==================================================");
55     const std::string run(" is running...");
56     const std::string suite("Test suite is ");
57
58     strm_ << separates << std::endl;
59     strm_ << prefix_ << suite << name_ << run << std::endl;
60     strm_ << separates << std::endl;
61 }
62
63 void simpletest::SimpleTestSuite::printEndMessage()
64 {
65     // テストの終了メッセージを、指定されたストリームに出力する。
66     const std::string separates("==================================================");
67     const std::string message("SimpleTest Results.");
68     
69     strm_ << separates << std::endl;
70     strm_ << prefix_ << message << std::endl;
71
72     // 結果を利用して出力する。
73     {
74         const std::string mes("executes tests ");
75         int count = testers_.size();
76  
77         strm_ << prefix_ << mes << count << " --> ";
78         strm_ << "success [" << runner_->getSuccess() << "] : ";
79         strm_ << "fail [" << runner_->getFail() << "] : ";
80         strm_ << "exception [" << runner_->getException() << "]" << std::endl;
81     }
82
83     strm_ << separates << std::endl;
84 }
85
86 smart_ptr<SimpleTestAsserter> simpletest::SimpleTestSuite::getAsserter()
87 {
88     return smart_ptr<simpletest::SimpleTestAsserter>(new
89                                                       simpletest::SimpleTestAsserter(strm_, prefix_));
90 }
91
92
93 simpletest::SimpleTestRunner::SimpleTestRunner(std::ostream& strm,
94                                                  const std::string& prefix) :
95     strm_(strm), prefix_(prefix), pImpl(new simpletest::SimpleTestRunner::PImpl)
96 {}
97
98 void simpletest::SimpleTestRunner::innerCheck(bool b)
99 {
100     // 関数が例外を返さなかった場合に実行されるチェック関数
101     pImpl->count++;
102     if (b)
103     {
104         pImpl->success++;
105         printSuccess();
106     } else {
107         pImpl->fail++;
108         printFail();
109     }
110 }
111
112 void simpletest::SimpleTestRunner::innerCheck(std::exception& e) {
113     // 例外が発行された場合、とりあえずはe.whatsを
114     // std::stringとして保持しておく。
115     pImpl->exception++;
116     printException(e);
117 }
118
119 void simpletest::SimpleTestRunner::printSuccess()
120 {
121     // 成功した場合のメッセージを出力する。
122     int count = pImpl->success + pImpl->fail + pImpl->exception;
123     strm_ << prefix_ << "test ";
124     strm_ << count << " is success." << std::endl;
125 }
126
127 void simpletest::SimpleTestRunner::printFail()
128 {
129     // 成功した場合のメッセージを出力する。
130     int count = pImpl->success + pImpl->fail + pImpl->exception;
131     strm_ << prefix_ << "test ";
132     strm_ << count << " is fail." << std::endl;
133 }
134
135 void simpletest::SimpleTestRunner::printException(const std::exception& e)
136 {
137     // 成功した場合のメッセージを出力する。
138     int count = pImpl->success + pImpl->fail + pImpl->exception;
139     strm_ << prefix_ << "test ";
140     strm_ << count << " is throw exception." << std::endl;
141     strm_ << e.what() << std::endl;
142 }
143
144
145 //================================================================================
146
147
148 simpletest::SimpleTestAsserter::SimpleTestAsserter(std::ostream& strm,
149                                                      const std::string& prefix) :
150     strm_(strm), prefix_(prefix), count_(0)
151 {
152 }
153
154 simpletest::SimpleTestAsserter::SimpleTestAsserter(const SimpleTestAsserter& asserter) :
155     strm_(asserter.strm_), prefix_(asserter.prefix_), count_(asserter.count_)
156 {
157 }
158
159 SimpleTestAsserter& simpletest::SimpleTestAsserter::operator=(const SimpleTestAsserter& asserter)
160 {
161     // 代入によってコピーを作成するための処理
162     SimpleTestAsserter a(asserter);
163     std::swap(*this, a);
164     return *this;
165 }
166
167 bool simpletest::SimpleTestAsserter::isOk() const
168 {
169     // count_は、checkの比較関数が失敗する度にこれがインクリメントされることに
170     // なっている。
171     return count_ == 0 ? true : false;
172 }