source: anotherchoice/tags/jsp-1.4.4-full-UTF8/cfg/base/option.cpp@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 29.1 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: option.cpp,v 1.3 2003/12/15 07:32:14 takayuki Exp $
51 */
52
53// $Header: /home/CVS/configurator/base/option.cpp,v 1.3 2003/12/15 07:32:14 takayuki Exp $
54
55#include "base/option.h"
56#include <assert.h>
57#include <algorithm>
58
59using namespace std;
60
61 //別のOptionItemが持つパラメータを自分に追加する
62void OptionParameter::OptionItem::mergeItem(const OptionItem & src)
63{
64 vector<string>::const_iterator scope;
65
66 //å…
67¨ã¦ã®ãƒ‘ラメータを自分の後ろに追加
68 scope = src.param.begin();
69 while(scope != src.param.end()) {
70 param.push_back(*scope);
71 ++ scope;
72 }
73}
74
75 //文字列のå…
76ˆé ­ã«ã‚る空白文字を取り除く
77namespace {
78 void TrimString(string & src)
79 {
80 string::size_type pos;
81
82 pos = src.find_first_not_of(" \t\r\n");
83 if(pos != 0)
84 src.erase(0, pos);
85 }
86}
87
88 //オプションパラメータを解析してOptionItemを生成する
89bool OptionParameter::OptionItem::createItem(OptionItem & _dest, string & argv)
90{
91 bool result;
92 string param;
93 string::size_type pos;
94 OptionItem dest;
95
96 result = true;
97
98 TrimString(argv);
99 if(argv.empty())
100 result = false; //中身が空っぽ
101 else {
102 //オプションのチェック
103 if(argv[0] == '-') {
104 pos = argv.find_first_of(" =");
105
106 if(argv.substr(0,pos).compare("-") == 0) { // - だけのオプションは受け付けない
107 result = false;
108 }
109 else {
110 if(pos != 1) {
111 if(pos != string::npos) {
112 dest = argv.substr(1, pos - 1);
113 argv.erase(0, pos + 1);
114 }
115 else {
116 dest = argv.substr(1);
117 argv.erase();
118 }
119 }
120 }
121 }
122
123 TrimString(argv);
124 while(!argv.empty() && argv[0] != '-') {
125 if(argv[0] == '"') {
126
127 //対になるダブルクォートを探す
128 pos = argv.find_first_of('"',1);
129 if(pos == string::npos) {
130 result = false;
131 break;
132 }
133
134 //ダブルクォートの中身を取る
135 param = argv.substr(1, pos - 1);
136
137 //ダブルクォートを消す
138 ++ pos;
139 }
140 else {
141
142 //次の区切りを探す
143 pos = argv.find_first_of(" \t\r\n");
144 if(pos == string::npos)
145 param = argv;
146 else
147 param = argv.substr(0,pos);
148 }
149
150 dest.addParameter(param);
151 argv.erase(0, pos);
152
153 TrimString(argv);
154 }
155 }
156
157 if(result)
158 _dest = dest;
159
160 return result;
161}
162
163 //無効なオプションアイテムの生成
164OptionParameter::OptionItem OptionParameter::OptionItem::createInvalidItem(void) throw()
165{
166 OptionItem result;
167
168 result.assign("");
169 return result;
170}
171
172
173 //å…
174¨ã¦ã®ãƒ‘ラメータ結合したものを取得
175string OptionParameter::OptionItem::getParameters(string punctuator) const throw()
176{
177 string result;
178
179 vector<string>::const_iterator scope;
180
181 if(isValid()) {
182 scope = param.begin();
183 while(scope != param.end()) {
184 result += punctuator;
185 result += *scope;
186 ++ scope;
187 }
188
189 if(!result.empty())
190 result.erase(0, punctuator.size()); //å…
191ˆé ­ã®åŒºåˆ‡ã‚Šå­ã‚’削除
192 }
193
194 return result;
195}
196
197 //オプションの個数のチェック
198bool OptionParameter::OptionItem::checkParameterCount(size_t required, bool allow_zero) const throw()
199{
200 bool result = true;
201 if(isValid()) {
202 size_t count = countParameter();
203 if(count != required || (!allow_zero && count == 0))
204 result = false;
205 }
206 else
207 result = false;
208 return result;
209}
210
211 //オプションパラメータのパース
212bool OptionParameter::parseOption(int _argc, char const * const * _argv, char const * _default) throw()
213{
214 bool result;
215 string arguments;
216 OptionItem work;
217 int i;
218
219 map<string, OptionItem>::iterator scope;
220
221 //プログラム名の取得
222 if(_argc > 0)
223 program_name.assign(_argv[0]);
224
225 //å…
226¨ã¦ã¤ãªã’ã‚‹
227 for(i=1;i<_argc;++i) {
228 arguments += _argv[i];
229 arguments += ' ';
230 }
231
232 if(arguments.empty() && _default != 0)
233 arguments.assign(_default);
234
235 cmdline += arguments;
236
237 result = true;
238
239 //各オプションの解析
240 while(!arguments.empty()) {
241
242 if(!OptionItem::createItem(work, arguments)) {
243 result = false;
244 break;
245 }
246
247 //同一のオプションがいたらマージする
248 scope = container.find(work);
249 if(scope != container.end())
250 scope->second.mergeItem(work);
251 else
252 container.insert(std::map<std::string, OptionItem>::value_type(work, work));
253 }
254
255 return result;
256}
257
258 //要素の検出
259map<string, OptionParameter::OptionItem>::iterator OptionParameter::_find(const std::string & name, bool check) throw()
260{
261 map<string, OptionParameter::OptionItem>::iterator scope;
262
263 scope = container.find(name);
264
265 //要素を使用したことを記録しておく
266 if(check && scope != container.end())
267 scope->second._check();
268
269 return scope;
270}
271
272
273 //オプションアイテムの参ç…
274§
275OptionParameter::OptionItem OptionParameter::get(const std::string & name, bool check) throw()
276{
277 OptionItem result;
278 map<string, OptionItem>::iterator scope;
279
280 scope = _find(name, check);
281 if(scope != container.end())
282 result = scope->second;
283 else
284 result = OptionItem::createInvalidItem();
285
286 return result;
287}
288
289
290 //å…
291¨ã¦ã®ã‚ªãƒ—ションが使用されたかどうかの確認
292bool OptionParameter::validateOption(void) const throw()
293{
294 map<string, OptionItem>::const_iterator scope;
295 bool result = true;
296
297 //å…
298¨ã¦ã®ã‚ªãƒ—ションがチェック済みであることを確認
299 scope = container.begin();
300 while(scope != container.end()) {
301 if(!scope->second.isChecked()) {
302 result = false;
303 break;
304 }
305 ++ scope;
306 }
307
308 return result;
309}
310
311
312 //使用されなかったオプション列を取得
313string OptionParameter::getInvalidOptions(void) const throw()
314{
315 map<string, OptionItem>::const_iterator scope;
316 string result;
317
318 //使用されなかったå…
319¨ã¦ã®ã‚ªãƒ—ションに対して
320 scope = container.begin();
321 while(scope != container.end()) {
322 const OptionItem & item = scope->second;
323 if(!item.isChecked()) {
324 result += " -";
325 result += item;
326
327 //オプションパラメータの列挙
328 size_t params = item.countParameter();
329 for(size_t i=0; i<params; ++i) {
330 result += " \"";
331 result += item[i];
332 result += '\"';
333 }
334 }
335 ++ scope;
336 }
337
338 //å…
339ˆé ­ã®ç©ºç™½ã‚’取り除く
340 if(!result.empty())
341 result = result.substr(1);
342
343 return result;
344}
345
346/***************** テストスィート *****************/
347
348#ifdef TESTSUITE
349#include "coverage_undefs.h"
350
351
352TESTSUITE_(main,OptionItem,OptionParameter)
353{
354 BEGIN_CASE("01","デフォルトパラメータが" DEFAULT_PARAMETER "になっている") {
355 OptionItem work;
356 if(work.compare(DEFAULT_PARAMETER) != 0)
357 TEST_FAIL;
358 } END_CASE;
359
360 //----
361
362 BEGIN_CASE("02","コンストラクタチェック (checked == false, パラメータ名)") {
363
364 BEGIN_CASE("1","OptionItem(void)") {
365 OptionItem work;
366 if(work.checked != false)
367 TEST_FAIL;
368 } END_CASE;
369
370 BEGIN_CASE("2","OptionItem(const string &)") {
371 OptionItem work("test");
372 if(work.compare("test") != 0 || work.checked != false)
373 TEST_FAIL;
374 } END_CASE;
375
376 BEGIN_CASE("3","OptionItem(const OptionItem &)") {
377 OptionItem dummy("test");
378 OptionItem work(dummy);
379 if(work.compare("test") != 0 || work.checked != false)
380 TEST_FAIL;
381 } END_CASE;
382
383 } END_CASE;
384
385 //----
386
387 BEGIN_CASE("03", "addParameter / countParameter / operator []") {
388 const char * container[] = { "first", "second", "third", "forth", "fifth", NULL };
389 const char ** param = container;
390 int i;
391
392 OptionItem work;
393
394 BEGIN_CASE("1", "作った直後のcountParameterは0") {
395 if(work.countParameter() != 0)
396 TEST_FAIL;
397 } END_CASE;
398
399 BEGIN_CASE("2", "addParameterするたびに1ずつ増えるはず") {
400 while(*param != NULL) {
401 size_t count = work.countParameter();
402
403 work.addParameter(*param);
404
405 if(work.countParameter() != count + 1)
406 TEST_FAIL;
407
408 ++ param;
409 }
410 } END_CASE;
411
412 BEGIN_CASE("3", "å…
413¥ã‚ŒãŸã‚‚のはちゃんとå…
414¥ã£ã¦ã‚‹") {
415 i = 0;
416 param = container;
417 while(*param != NULL) {
418 if(work[i].compare(*param) != 0)
419 TEST_FAIL;
420
421 ++ i;
422 ++ param;
423 }
424 } END_CASE;
425
426 BEGIN_CASE("4", "operator[]に範囲外のパラメータをå…
427¥ã‚Œã‚‹ã¨ç©ºæ–‡å­—が返る") {
428 if(!work[10000].empty())
429 TEST_FAIL;
430 } END_CASE;
431 } END_CASE;
432
433 //----
434
435 BEGIN_CASE("04", "hasParameter") {
436 OptionItem work;
437
438 BEGIN_CASE("1", "中身がないときはfalseが返る") {
439 if(work.hasParameter())
440 TEST_FAIL;
441 } END_CASE;
442
443 BEGIN_CASE("2", "中身があるときはtrueが返る") {
444 work.addParameter("dummy");
445 if(!work.hasParameter())
446 TEST_FAIL;
447 } END_CASE;
448 } END_CASE;
449
450 //----
451
452 BEGIN_CASE("mergeItem", "mergeItem") {
453 OptionItem work;
454 OptionItem work2;
455
456 work.addParameter("one");
457 work2.addParameter("two");
458
459 work.mergeItem(work2);
460
461 BEGIN_CASE("1","マージされている") {
462 if(work[0].compare("one") != 0 || work[1].compare("two") != 0 || work.countParameter() != 2)
463 TEST_FAIL;
464 } END_CASE;
465
466 BEGIN_CASE("2","変更å…
467ƒã¯å¤‰åŒ–なし") {
468 if(work2[0].compare("two") != 0 || work2.countParameter() != 1)
469 TEST_FAIL;
470 } END_CASE;
471
472 } END_CASE;
473
474 //----
475
476 BEGIN_CASE("isChecked/checked", "isChecked/check") {
477 OptionItem work;
478
479 BEGIN_CASE("1","最初はunchecked状æ…
480‹") {
481 if(work.isChecked() != false)
482 TEST_FAIL;
483 } END_CASE;
484
485 BEGIN_CASE("2","checkをつける") {
486 work._check();
487 if(work.isChecked() != true)
488 TEST_FAIL;
489 } END_CASE;
490
491 BEGIN_CASE("3","もう一回やってもトグルにならない") {
492 work._check();
493 if(work.isChecked() != true)
494 TEST_FAIL;
495 } END_CASE;
496
497 } END_CASE;
498
499 //----
500
501 BEGIN_CASE("CopyConstructor", "コピーコンストラクタでパラメータが移るか") {
502 OptionItem src;
503 src.addParameter("one");
504
505 OptionItem dest(src);
506
507 if(dest.countParameter() != 1 || dest[0].compare("one") != 0)
508 TEST_FAIL;
509 } END_CASE;
510
511 //----
512
513 BEGIN_CASE("TrimString", "TrinStringがちゃんと動くか") {
514 BEGIN_CASE("1","å…
515ˆé ­ã®ç©ºç™½æ–‡å­—が消える") {
516 string work(" \r\n\ttest");
517 TrimString(work);
518 if(work.compare("test") != 0)
519 TEST_FAIL;
520 } END_CASE;
521
522 BEGIN_CASE("2","空白文字だけから成る文字列") {
523 string work(" ");
524 TrimString(work);
525 if(!work.empty())
526 TEST_FAIL;
527 } END_CASE;
528 } END_CASE;
529
530 //----
531
532 BEGIN_CASE("createItem", "createItem関数の動作検証") {
533 BEGIN_CASE("1", "空っぽの文字列をいれると失敗する") {
534 OptionItem work;
535 string param("");
536 if(OptionItem::createItem(work, param))
537 TEST_FAIL;
538 } END_CASE;
539
540 BEGIN_CASE("2", "引数なしオプション") {
541 OptionItem work;
542 string arg("-test");
543 if(!OptionItem::createItem(work, arg))
544 TEST_FAIL;
545 if(work.compare("test") != 0 || work.hasParameter())
546 TEST_FAIL;
547 if(!arg.empty())
548 TEST_FAIL;
549 } END_CASE;
550
551 BEGIN_CASE("3", "連続する引数なしオプション") {
552 OptionItem work;
553 string arg("-test -test2");
554 if(!OptionItem::createItem(work, arg))
555 TEST_FAIL;
556 if(arg.compare("-test2") != 0)
557 TEST_FAIL;
558 } END_CASE;
559
560 BEGIN_CASE("4", "引数つきオプション(-test param)") {
561 OptionItem work;
562 string arg("-test param");
563 if(!OptionItem::createItem(work, arg))
564 TEST_FAIL;
565 if(work.compare("test") != 0)
566 TEST_FAIL;
567 if(work.countParameter() != 1 || work[0].compare("param") != 0)
568 TEST_FAIL;
569 if(!arg.empty())
570 TEST_FAIL;
571 } END_CASE;
572
573 BEGIN_CASE("5", "引数つきオプション(-test=param)") {
574 OptionItem work;
575 string arg("-test=param");
576 if(!OptionItem::createItem(work, arg))
577 TEST_FAIL;
578 if(work.compare("test") != 0)
579 TEST_FAIL;
580 if(work.countParameter() != 1 || work[0].compare("param") != 0)
581 TEST_FAIL;
582 if(!arg.empty())
583 TEST_FAIL;
584 } END_CASE;
585
586 BEGIN_CASE("6", "引数つきオプション(-test=\"a b c\")") {
587 OptionItem work;
588 string arg("-test=\"a b c\"");
589 if(!OptionItem::createItem(work, arg))
590 TEST_FAIL;
591 if(work.compare("test") != 0)
592 TEST_FAIL;
593 if(work.countParameter() != 1 || work[0].compare("a b c") != 0)
594 TEST_FAIL;
595 if(!arg.empty())
596 TEST_FAIL;
597 } END_CASE;
598
599 BEGIN_CASE("7", "連続した引数つきオプション(-test one two)") {
600 OptionItem work;
601 string arg("-test one two");
602 if(!OptionItem::createItem(work, arg))
603 TEST_FAIL;
604 if(work.compare("test") != 0)
605 TEST_FAIL;
606 if(work.countParameter() != 2 || work[0].compare("one") != 0 || work[1].compare("two") != 0)
607 TEST_FAIL;
608 if(!arg.empty())
609 TEST_FAIL;
610 } END_CASE;
611
612 BEGIN_CASE("8", "ハイフン") {
613 BEGIN_CASE("1", "ハイフンだけの引数は受け付けない") {
614 OptionItem work;
615 string arg("-");
616 if(OptionItem::createItem(work, arg))
617 TEST_FAIL;
618 } END_CASE;
619
620 BEGIN_CASE("2", "ハイフンだけの引数は受け付けない(連続)") {
621 OptionItem work;
622 string arg("- - -");
623 if(OptionItem::createItem(work, arg))
624 TEST_FAIL;
625 } END_CASE;
626
627 BEGIN_CASE("3", "ダブルクォートでくくられたハイフンは受け付ける") {
628 OptionItem work;
629 string arg("\"-\"");
630 if(!OptionItem::createItem(work, arg))
631 TEST_FAIL;
632 if(work.compare(DEFAULT_PARAMETER) != 0 || work.countParameter() != 1 || work[0].compare("-") != 0)
633 TEST_FAIL;
634 } END_CASE;
635
636 } END_CASE;
637
638 BEGIN_CASE("9", "対になるダブルクォートが欠けた引数は受け付けない") {
639 OptionItem work;
640 string arg("-test=\"a b c");
641 if(OptionItem::createItem(work, arg))
642 TEST_FAIL;
643 } END_CASE;
644
645 } END_CASE;
646
647 BEGIN_CASE("isValid/createInvalidItem", "無効を示すインスタンスを生成でき、それを判定できる") {
648 OptionItem work;
649
650 BEGIN_CASE("1","デフォルトコンストラクタで生成したオブジェクトは有効") {
651 if(!work.isValid())
652 TEST_FAIL;
653 } END_CASE;
654
655 BEGIN_CASE("2","無効インスタンスは当然無効") {
656 work = OptionItem::createInvalidItem();
657 if(work.isValid())
658 TEST_FAIL;
659 } END_CASE;
660 } END_CASE;
661
662 BEGIN_CASE("getParameters","getParameters") {
663 BEGIN_CASE("1","正しくオプションを結合できる") {
664 OptionItem work;
665 string arg("-test a b c d e f g");
666
667 TEST_CASE("0","[前提]オプション解析に成功する", OptionItem::createItem(work,arg));
668 TEST_CASE("1","結合できる", work.getParameters().compare("a b c d e f g") == 0);
669 TEST_CASE("2","区切り氏を指定して結合できる", work.getParameters(",").compare("a,b,c,d,e,f,g") == 0);
670 } END_CASE;
671 } END_CASE;
672
673 BEGIN_CASE("checkParameterCount","checkParameterCount") {
674 BEGIN_CASE("1","オプションの数があっていれはtrue") {
675 OptionItem work;
676 string arg("-test a b c d e f g");
677
678 TEST_CASE("0","[前提]オプション解析に成功する", OptionItem::createItem(work,arg));
679
680 if(!work.checkParameterCount(7))
681 TEST_FAIL;
682 } END_CASE;
683
684 BEGIN_CASE("2","オプションの数が間違っているとfalse") {
685 OptionItem work;
686 string arg("-test a b c d e f g");
687
688 TEST_CASE("0","[前提]オプション解析に成功する", OptionItem::createItem(work,arg));
689
690 if(work.checkParameterCount(2))
691 TEST_FAIL;
692 } END_CASE;
693
694 BEGIN_CASE("3","オプションがなくて、!allow_zeroならfalse") {
695 OptionItem work;
696 string arg("-test");
697
698 TEST_CASE("0","[前提]オプション解析に成功する", OptionItem::createItem(work,arg));
699
700 if(work.checkParameterCount(1,false))
701 TEST_FAIL;
702 } END_CASE;
703
704 BEGIN_CASE("4","オプションがなくて、allow_zeroならtrue") {
705 OptionItem work;
706 string arg("-test");
707
708 TEST_CASE("0","[前提]オプション解析に成功する", OptionItem::createItem(work,arg));
709
710 if(work.checkParameterCount(1,true))
711 TEST_FAIL;
712 } END_CASE;
713
714 } END_CASE;
715}
716
717/********************************* テストスィート *********************************/
718
719TESTSUITE(main,OptionParameter)
720{
721 SINGLETON(OptionParameter);
722
723 BEGIN_CASE("countItem","オプションアイテムの数が正しく取得できる") {
724 OptionParameter param;
725 if(param.countItem() != 0)
726 TEST_FAIL;
727
728 param.container.insert(pair<string, OptionItem>(DEFAULT_PARAMETER, OptionItem()));
729 if(param.countItem() != 1)
730 TEST_FAIL;
731 } END_CASE;
732
733 BEGIN_CASE("opeator []","operator []で要素にアクセスできる") {
734 OptionParameter param;
735 OptionItem work;
736 string arg("-test param");
737
738 OptionItem::createItem(work, arg);
739 param.container.insert(pair<string, OptionItem>(work, work));
740
741 BEGIN_CASE("1", "operator [] (const string &)で総祖にアクセスできる") {
742 if(param[string("test")][0].compare("param") != 0)
743 TEST_FAIL;
744 } END_CASE;
745
746 BEGIN_CASE("2", "operator [] (const char *)で総祖にアクセスできる") {
747 if(param["test"][0].compare("param") != 0)
748 TEST_FAIL;
749 } END_CASE;
750
751 BEGIN_CASE("3", "operator []で触ると、checkがå…
752¥ã‚‹") {
753 if(!param["test"].isChecked())
754 TEST_FAIL;
755 } END_CASE;
756
757 BEGIN_CASE("4", "operator []に無効なキーをå…
758¥ã‚Œã‚‹ã¨ã€ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ãŒè¿”ってくる") {
759 if(param["nonexist"].isValid())
760 TEST_FAIL;
761 } END_CASE;
762 } END_CASE;
763
764 BEGIN_CASE("get","要素へのアクセス") {
765 OptionParameter param;
766 OptionItem work;
767
768 OptionItem::createItem(work, string("-test param"));
769 param.container.insert(pair<string, OptionItem>(work, work));
770 OptionItem::createItem(work, string("-test2 param2"));
771 param.container.insert(pair<string, OptionItem>(work, work));
772
773 BEGIN_CASE("1","get(test)で要素が取得でき、チェックがå…
774¥ã‚‹") {
775 TEST_CASE("1","要素が存在する", (work = param.get("test")).isValid());
776 TEST_CASE("2","チェックがå…
777¥ã£ã¦ã„ã‚‹", work.isChecked() );
778 TEST_CASE("3","要素はパラメータを持つ", work.hasParameter() );
779 } END_CASE;
780
781 BEGIN_CASE("2","get(test2,false)で要素が取得でき、チェックはつかない") {
782 TEST_CASE("1","要素が存在する", (work = param.get("test2",false)).isValid());
783 TEST_CASE("2","チェックがå…
784¥ã£ã¦ã„ない", !work.isChecked() );
785 } END_CASE;
786
787 BEGIN_CASE("3","すでにチェックのついたtestに対し、get(test,false)で要素が取得でき、チェック済み") {
788 TEST_CASE("1","要素が存在する", (work = param.get("test",false)).isValid());
789 TEST_CASE("2","チェックがå…
790¥ã£ã¦ã„ない", work.isChecked() );
791 } END_CASE;
792
793 BEGIN_CASE("4","get(無効な名前)で無効な要素が返る") {
794 TEST_CASE("1","要素が存在する", !param.get("unknown").isValid());
795 } END_CASE;
796 } END_CASE;
797
798
799 BEGIN_CASE("parseOption","パラメータのパースが正常にできるか") {
800 BEGIN_CASE("01","中身が何もないパラメータを与えても成功する") {
801 OptionParameter param;
802 char ** argv = { NULL };
803
804 if(!param.parseOption(0, argv))
805 TEST_FAIL;
806 } END_CASE;
807
808 BEGIN_CASE("02","プログラム名はオプションとして解析されない") {
809 OptionParameter param;
810 char * argv[] = { "test.exe", NULL };
811
812 if(!param.parseOption(1, argv))
813 TEST_FAIL;
814 if(param.countItem() != 0)
815 TEST_FAIL;
816 } END_CASE;
817
818 BEGIN_CASE("03","パラメータがそれなりに解析される") {
819 OptionParameter param;
820 char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL };
821
822 if(!param.parseOption(4, argv))
823 TEST_FAIL;
824 if(param.countItem() != 2)
825 TEST_FAIL;
826
827 if(param[string("test")][0].compare("param") != 0)
828 TEST_FAIL;
829
830 if(param["test2"][0].compare("dummy") != 0)
831 TEST_FAIL;
832
833 if(param.getProgramName().compare("test.exe") != 0)
834 TEST_FAIL;
835
836 } END_CASE;
837
838 BEGIN_CASE("04","引数列が取れる") {
839 OptionParameter param;
840 char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL };
841
842 if(!param.parseOption(4, argv))
843 TEST_FAIL;
844
845 if(param.getCommandLine().compare("-test param -test2=\"dummy\" ") != 0)
846 TEST_FAIL;
847 } END_CASE;
848
849 BEGIN_CASE("05","何も引数が無いときにはデフォルト引数をひいてくる") {
850 OptionParameter param;
851 char * argv[] = { "test.exe", NULL };
852
853 if(!param.parseOption(1, argv, "-default=parameter"))
854 TEST_FAIL;
855
856 if(param.getCommandLine().compare("-default=parameter ") != 0)
857 TEST_FAIL;
858 } END_CASE;
859
860 } END_CASE;
861
862 BEGIN_CASE("04","参ç…
863§ãƒžãƒ¼ã‚¯ã‚’つける") {
864 OptionParameter param;
865 char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL };
866
867 if(!param.parseOption(4, argv))
868 TEST_FAIL;
869
870 if(param.container.find(string("test"))->second.isChecked())
871 TEST_FAIL;
872
873 param.check("test");
874 if(!param.container.find(string("test"))->second.isChecked())
875 TEST_FAIL;
876 } END_CASE;
877
878 BEGIN_CASE("05","validateOption") {
879 OptionParameter param;
880 char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL };
881
882 if(!param.parseOption(4, argv))
883 TEST_FAIL;
884
885 BEGIN_CASE("1","何も使用していないときにはfalse") {
886 if(param.validateOption())
887 TEST_FAIL;
888 } END_CASE;
889
890 param["test"]._check();
891 BEGIN_CASE("2","ほかにチェックしていないオプションがあればfalse") {
892 if(param.validateOption())
893 TEST_FAIL;
894 } END_CASE;
895
896 param["test2"]._check();
897 BEGIN_CASE("3","å…
898¨ã¦ä½¿ç”¨ã•ã‚Œã‚Œã°true") {
899 if(!param.validateOption())
900 TEST_FAIL;
901 } END_CASE;
902 } END_CASE;
903
904 BEGIN_CASE("06","getInvalidOptions") {
905 OptionParameter param;
906 char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL };
907
908 if(!param.parseOption(4, argv))
909 TEST_FAIL;
910
911 BEGIN_CASE("1","何も使用していないときにはå…
912¨ã¦ã®ã‚ªãƒ—ションが無効") {
913 if(param.getInvalidOptions().compare("-test \"param\" -test2 \"dummy\"") != 0)
914 TEST_FAIL;
915 } END_CASE;
916
917 param["test"]._check();
918 BEGIN_CASE("2","ほかにチェックしていないオプションがあればそれが取れる") {
919 if(param.getInvalidOptions().compare("-test2 \"dummy\"") != 0)
920 TEST_FAIL;
921 } END_CASE;
922 } END_CASE;
923
924 BEGIN_CASE("07","find") {
925 OptionParameter param;
926 char * argv[] = { "test.exe", "-test", "param", "-test2=\"dummy\"", NULL };
927
928 if(!param.parseOption(4, argv))
929 TEST_FAIL;
930
931 BEGIN_CASE("1","存在するオプションに対してtrueが返る") {
932 if(!param.find("test") || !param.find("test2"))
933 TEST_FAIL;
934 } END_CASE;
935
936 BEGIN_CASE("2","存在しないオプションに対してfalseが返る") {
937 if(param.find("unknown"))
938 TEST_FAIL;
939 } END_CASE;
940
941 BEGIN_CASE("3","空文字に対してfalseが返る") {
942 if(param.find(""))
943 TEST_FAIL;
944 } END_CASE;
945 } END_CASE;
946
947 Singleton<OptionParameter>::restoreContext(context);
948}
949
950#endif
951
952
Note: See TracBrowser for help on using the repository browser.