dfect 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +2 -2
- data/HISTORY +306 -0
- data/INSTALL +35 -0
- data/README +95 -0
- data/USAGE +393 -0
- data/doc/api/Dfect.html +3179 -0
- data/doc/api/Object.html +107 -0
- data/doc/api/_index.html +107 -0
- data/doc/api/class_list.html +36 -0
- data/doc/api/css/common.css +1 -0
- data/doc/api/css/full_list.css +50 -0
- data/doc/api/css/style.css +268 -0
- data/doc/api/file.LICENSE.html +73 -0
- data/doc/api/file_list.html +38 -0
- data/doc/api/frames.html +13 -0
- data/doc/api/index.html +72 -13
- data/doc/api/js/app.js +99 -0
- data/doc/api/js/full_list.js +106 -0
- data/doc/api/js/{jquery-1.3.2.min.js → jquery.js} +0 -0
- data/doc/api/method_list.html +339 -0
- data/doc/api/top-level-namespace.html +87 -0
- data/doc/index.erb +16 -9
- data/doc/index.html +1057 -726
- data/lib/dfect.rb +431 -284
- data/lib/dfect/auto.rb +2 -6
- data/lib/dfect/inochi.rb +48 -0
- data/lib/dfect/inochi.yaml +75 -0
- data/lib/dfect/mini.rb +1 -5
- data/lib/dfect/spec.rb +6 -13
- data/lib/dfect/unit.rb +21 -33
- data/test/dfect/inochi_test.rb +17 -0
- data/test/{dfect.rb → dfect_test.rb} +167 -7
- data/test/runner +25 -0
- data/test/test_helper.rb +1 -0
- metadata +43 -55
- data/doc/api/apple-touch-icon.png +0 -0
- data/doc/api/classes/Class.html +0 -73
- data/doc/api/classes/Dfect.html +0 -1245
- data/doc/api/classes/Kernel.html +0 -322
- data/doc/api/classes/Object.html +0 -72
- data/doc/api/created.rid +0 -1
- data/doc/api/css/main.css +0 -263
- data/doc/api/css/panel.css +0 -383
- data/doc/api/css/reset.css +0 -53
- data/doc/api/favicon.ico +0 -0
- data/doc/api/files/CREDITS.html +0 -65
- data/doc/api/files/LICENSE.html +0 -76
- data/doc/api/files/lib/dfect/auto_rb.html +0 -80
- data/doc/api/files/lib/dfect/mini_rb.html +0 -77
- data/doc/api/files/lib/dfect/spec_rb.html +0 -73
- data/doc/api/files/lib/dfect/unit_rb.html +0 -73
- data/doc/api/files/lib/dfect_rb.html +0 -74
- data/doc/api/i/arrows.png +0 -0
- data/doc/api/i/results_bg.png +0 -0
- data/doc/api/i/tree_bg.png +0 -0
- data/doc/api/js/jquery-effect.js +0 -593
- data/doc/api/js/main.js +0 -22
- data/doc/api/js/searchdoc.js +0 -628
- data/doc/api/panel/index.html +0 -71
- data/doc/api/panel/search_index.js +0 -1
- data/doc/api/panel/tree.js +0 -1
- data/doc/history.erb +0 -161
- data/doc/intro.erb +0 -104
- data/doc/setup.erb +0 -107
- data/doc/usage.erb +0 -310
- data/rakefile +0 -21
@@ -0,0 +1,87 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta name="Content-Type" content="text/html; charset=UTF-8" />
|
6
|
+
<title>Top Level Namespace</title>
|
7
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
8
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
9
|
+
|
10
|
+
<script type="text/javascript" charset="utf-8">
|
11
|
+
relpath = '';
|
12
|
+
if (relpath != '') relpath += '/';
|
13
|
+
</script>
|
14
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
15
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
16
|
+
|
17
|
+
</head>
|
18
|
+
<body>
|
19
|
+
<script type="text/javascript" charset="utf-8">
|
20
|
+
if (window.top.frames.main) document.body.className = 'frames';
|
21
|
+
</script>
|
22
|
+
|
23
|
+
<div id="header">
|
24
|
+
<div id="menu">
|
25
|
+
|
26
|
+
<a href="_index.html">Index</a> »
|
27
|
+
|
28
|
+
|
29
|
+
<span class="title">Top Level Namespace</span>
|
30
|
+
|
31
|
+
|
32
|
+
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="search">
|
36
|
+
<a id="class_list_link" href="#">Class List</a>
|
37
|
+
<a id="method_list_link" href="#">Method List</a>
|
38
|
+
<a id ="file_list_link" href="#">File List</a>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<div class="clear"></div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<iframe id="search_frame"></iframe>
|
45
|
+
|
46
|
+
<div id="content"><h1>Top Level Namespace
|
47
|
+
|
48
|
+
|
49
|
+
</h1>
|
50
|
+
|
51
|
+
<dl class="box">
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
</dl>
|
60
|
+
<div class="clear"></div>
|
61
|
+
|
62
|
+
<h2>Defined Under Namespace</h2>
|
63
|
+
<p class="children">
|
64
|
+
|
65
|
+
|
66
|
+
<strong class="modules">Modules:</strong> <a href="Dfect.html" title="Dfect (module)">Dfect</a>
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
<strong class="classes">Classes:</strong> <a href="Object.html" title="Object (class)">Object</a>
|
71
|
+
|
72
|
+
|
73
|
+
</p>
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<div id="footer">
|
81
|
+
Generated on Sun Mar 21 16:21:53 2010 by
|
82
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool">yard</a>
|
83
|
+
0.5.3 (ruby-1.9.1).
|
84
|
+
</div>
|
85
|
+
|
86
|
+
</body>
|
87
|
+
</html>
|
data/doc/index.erb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
% api_reference_url = 'api/index.html'
|
2
|
+
% api_reference = "[API reference](#{api_reference_url})"
|
3
|
+
% source_code_tool = '[Git](http://git-scm.com)'
|
4
|
+
% source_code_url = 'http://github.com/sunaku/dfect'
|
5
|
+
% issue_tracker_url = 'http://github.com/sunaku/dfect/issues'
|
5
6
|
|
6
|
-
|
7
|
+
%|part "Welcome"
|
8
|
+
%+ "../README"
|
7
9
|
|
8
|
-
|
9
|
-
%+ "
|
10
|
-
|
11
|
-
|
10
|
+
%|part "Setup"
|
11
|
+
%+ "../INSTALL"
|
12
|
+
|
13
|
+
%|part "Usage"
|
14
|
+
%+ "../USAGE"
|
15
|
+
|
16
|
+
%|part "History"
|
17
|
+
%|project_history
|
18
|
+
%+ "../HISTORY"
|
data/doc/index.html
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
<head>
|
6
6
|
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
|
7
7
|
|
8
|
-
<meta name="generator" content="ERBook 9.
|
8
|
+
<meta name="generator" content="ERBook 9.2.1 (2009-11-18) — http://snk.tuxfamily.org/lib/erbook/"/>
|
9
9
|
|
10
|
-
<title>Dfect
|
10
|
+
<title>Dfect — Assertion testing library for Ruby</title>
|
11
11
|
|
12
12
|
<meta name="author" content="Suraj N. Kurapati"/>
|
13
13
|
|
14
|
-
<meta name="date" content="
|
14
|
+
<meta name="date" content="21 March 2010"/>
|
15
15
|
|
16
16
|
<link rel="alternate" type="application/rss+xml" href="http://snk.tuxfamily.org/lib/dfect/ann.xml"/>
|
17
17
|
|
@@ -414,14 +414,14 @@
|
|
414
414
|
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
415
415
|
.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
|
416
416
|
----------------------------------*/
|
417
|
-
.ui-tabs {
|
418
|
-
.ui-tabs .ui-tabs-nav { list-style: none;
|
419
|
-
.ui-tabs .ui-tabs-nav li {
|
420
|
-
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em;
|
421
|
-
.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
|
417
|
+
.ui-tabs { padding: .2em; zoom: 1; }
|
418
|
+
.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; }
|
419
|
+
.ui-tabs .ui-tabs-nav li { position: relative; float: left; margin: 0 .2em -1px 0; padding: 0; }
|
420
|
+
.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; }
|
421
|
+
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; }
|
422
422
|
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
423
423
|
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
424
|
-
.ui-tabs .ui-tabs-panel { display: block; border: 0;
|
424
|
+
.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; }
|
425
425
|
.ui-tabs .ui-tabs-hide { display: none !important; }
|
426
426
|
|
427
427
|
/*]]>*/
|
@@ -440,7 +440,7 @@ em, strong, dt {
|
|
440
440
|
blockquote {
|
441
441
|
color: #333;
|
442
442
|
font-style: italic;
|
443
|
-
background-image: url(
|
443
|
+
background-image: url(cid:81899006);
|
444
444
|
background-repeat: no-repeat;
|
445
445
|
margin-left: 0;
|
446
446
|
padding-left: 65px;
|
@@ -473,23 +473,23 @@ h1, h2, h3, h4, h5, h6, .title {
|
|
473
473
|
font-weight: lighter;
|
474
474
|
font-family: Constantia, "Book Antiqua", "URW Bookman L", serif; }
|
475
475
|
|
476
|
-
#
|
476
|
+
#_floats h1, #_floats h2, #_floats h3, #_floats h4, #_floats h5, #_floats h6 {
|
477
477
|
margin-top: 1.25em; }
|
478
478
|
|
479
|
-
#
|
479
|
+
#_document h1, #_document h2, #_document h3, #_document h4, #_document h5, #_document h6 {
|
480
480
|
margin-top: 2.5em;
|
481
481
|
line-height: 1.25em; }
|
482
|
-
#
|
482
|
+
#_document h1 {
|
483
483
|
font-size: 2.0em; }
|
484
|
-
#
|
484
|
+
#_document h2 {
|
485
485
|
font-size: 1.8em; }
|
486
|
-
#
|
486
|
+
#_document h3 {
|
487
487
|
font-size: 1.6em; }
|
488
|
-
#
|
488
|
+
#_document h4 {
|
489
489
|
font-size: 1.4em; }
|
490
|
-
#
|
490
|
+
#_document h5 {
|
491
491
|
font-size: 1.2em; }
|
492
|
-
#
|
492
|
+
#_document h6 {
|
493
493
|
font-size: 1.0em; }
|
494
494
|
|
495
495
|
table {
|
@@ -508,28 +508,33 @@ th, td {
|
|
508
508
|
th {
|
509
509
|
background-color: #F5F5F5; }
|
510
510
|
|
511
|
-
#
|
511
|
+
#_header > .title {
|
512
512
|
font-size: 2.25em; }
|
513
513
|
|
514
514
|
@media print {
|
515
|
-
#
|
515
|
+
#_header .printer_friendly_toggle {
|
516
516
|
display: none; } }
|
517
517
|
|
518
518
|
@media screen {
|
519
|
-
#
|
520
|
-
display: inline; }
|
519
|
+
#_header .printer_friendly_toggle {
|
520
|
+
display: inline; }
|
521
|
+
#_header .printer_friendly_toggle label:hover {
|
522
|
+
cursor: pointer; } }
|
521
523
|
|
522
|
-
#
|
524
|
+
#_abstract {
|
523
525
|
margin-bottom: 5em; }
|
524
526
|
|
525
|
-
#
|
527
|
+
#_contents ul > li {
|
526
528
|
list-style-type: none; }
|
527
|
-
#
|
529
|
+
#_contents li ul {
|
528
530
|
padding-bottom: 1em; }
|
529
|
-
#
|
531
|
+
#_contents > ul {
|
530
532
|
padding-left: 1em; }
|
531
533
|
|
532
|
-
#
|
534
|
+
#_references > ol > li {
|
535
|
+
margin-bottom: 1em; }
|
536
|
+
|
537
|
+
#_footer {
|
533
538
|
padding-top: 1em;
|
534
539
|
text-align: center;
|
535
540
|
margin: auto; }
|
@@ -541,25 +546,19 @@ th {
|
|
541
546
|
display: block;
|
542
547
|
margin-top: 0.25em; }
|
543
548
|
|
544
|
-
.paragraph > .title
|
545
|
-
font-size: large;
|
546
|
-
margin-top: 2em; }
|
547
|
-
|
548
|
-
.tip, .note, .caution, .warning, .important, .figure, .table, .example, .equation, .procedure {
|
549
|
-
margin: 3em; }
|
550
|
-
|
551
|
-
.tip .nav, .note .nav, .caution .nav, .warning .nav, .important .nav, .figure .nav, .table .nav, .example .nav, .equation .nav, .procedure .nav {
|
552
|
-
margin-right: -3em; }
|
549
|
+
.paragraph > .title {
|
550
|
+
font-size: large; }
|
553
551
|
|
554
|
-
.
|
552
|
+
._float > .title {
|
553
|
+
font-size: large; }
|
554
|
+
._float > .content {
|
555
555
|
min-height: 48px; }
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
margin-left: 0; }
|
556
|
+
._float > .content > .icon {
|
557
|
+
float: left;
|
558
|
+
margin-top: 0;
|
559
|
+
margin-right: 1em;
|
560
|
+
margin-bottom: 1em;
|
561
|
+
margin-left: 0; }
|
563
562
|
|
564
563
|
.figure > .title {
|
565
564
|
text-align: center; }
|
@@ -575,7 +574,10 @@ th {
|
|
575
574
|
padding: 0.5em;
|
576
575
|
background-color: #FFFFFF; }
|
577
576
|
|
578
|
-
#
|
577
|
+
#_loading:before {
|
578
|
+
content: "Loading..."; }
|
579
|
+
|
580
|
+
#_body, #_abstract > .title, #_contents > .title, .part > .title, .chapter > .title, .section > .title, #_references > .title {
|
579
581
|
display: none; }
|
580
582
|
|
581
583
|
.tabs {
|
@@ -587,6 +589,9 @@ th {
|
|
587
589
|
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
|
588
590
|
cursor: pointer; }
|
589
591
|
|
592
|
+
li > p:first-child {
|
593
|
+
display: inline; }
|
594
|
+
|
590
595
|
tt {
|
591
596
|
background-color: #F0F8FF; }
|
592
597
|
|
@@ -597,8 +602,11 @@ pre {
|
|
597
602
|
background-color: #F5FFDF;
|
598
603
|
padding: 1em;
|
599
604
|
display: inline-block;
|
600
|
-
|
601
|
-
|
605
|
+
min-width: 95%;
|
606
|
+
margin: 0; }
|
607
|
+
|
608
|
+
ins ~ div {
|
609
|
+
margin-top: 1.5em; }
|
602
610
|
|
603
611
|
code.para {
|
604
612
|
cursor: text;
|
@@ -625,37 +633,60 @@ a {
|
|
625
633
|
a:visited {
|
626
634
|
color: #800080; }
|
627
635
|
a[href]:not([href^="#"]) {
|
628
|
-
background: url(
|
636
|
+
background: url(cid:82357576);
|
629
637
|
background-position: center right;
|
630
638
|
background-repeat: no-repeat;
|
631
639
|
padding-right: 13px; }
|
632
640
|
|
633
|
-
#
|
641
|
+
#_header > .logo {
|
634
642
|
text-align: center; }
|
635
|
-
#
|
643
|
+
#_header > .title_and_subtitle {
|
636
644
|
float: left;
|
637
645
|
margin-right: 1.5em; }
|
638
|
-
#
|
646
|
+
#_header > .title_and_subtitle .title {
|
639
647
|
margin-top: 0.25em; }
|
640
|
-
#
|
648
|
+
#_header > .authors_and_date {
|
641
649
|
text-align: right; }
|
642
|
-
#
|
650
|
+
#_header > .authors_and_date .authors, #_header > .authors_and_date .date {
|
643
651
|
margin-top: 0;
|
644
652
|
margin-bottom: 0.25em; }
|
645
|
-
#
|
653
|
+
#_header > .authors_and_date .date {
|
646
654
|
font-weight: lighter; }
|
647
655
|
|
648
|
-
#
|
656
|
+
#_contents li ul {
|
649
657
|
border-left: thick solid #F5F5F5; }
|
650
|
-
#
|
658
|
+
#_contents li ul:hover {
|
651
659
|
border-color: #DCDCDC; }
|
652
660
|
|
653
|
-
#
|
654
|
-
background: url(
|
661
|
+
#_contents a:target, #_floats a:target {
|
662
|
+
background: url(cid:82357212);
|
655
663
|
background-position: center right;
|
656
664
|
background-repeat: no-repeat;
|
657
665
|
padding-right: 20px; }
|
658
666
|
|
667
|
+
.paragraph {
|
668
|
+
margin-top: 1.5em;
|
669
|
+
margin-bottom: 1.5em; }
|
670
|
+
.paragraph > .nav {
|
671
|
+
float: left; }
|
672
|
+
.paragraph > .title {
|
673
|
+
padding-left: 2.5em;
|
674
|
+
padding-top: 0.25em; }
|
675
|
+
|
676
|
+
._float {
|
677
|
+
margin: 1.5em; }
|
678
|
+
._float > .title {
|
679
|
+
padding-top: 0.5em;
|
680
|
+
padding-left: 1em;
|
681
|
+
padding-right: 1em; }
|
682
|
+
._float > .nav {
|
683
|
+
position: relative;
|
684
|
+
z-index: 1;
|
685
|
+
top: 0.25em;
|
686
|
+
right: 0.25em; }
|
687
|
+
._float > .content {
|
688
|
+
margin: 1em; }
|
689
|
+
|
659
690
|
.nav {
|
660
691
|
float: right;
|
661
692
|
clear: right; }
|
@@ -664,14 +695,40 @@ a {
|
|
664
695
|
|
665
696
|
.ui-tabs > .ui-tabs-panel > .nav {
|
666
697
|
position: relative;
|
667
|
-
margin-top: -3.
|
668
|
-
margin-right: -
|
698
|
+
margin-top: -3.4em;
|
699
|
+
margin-right: -1.25em; }
|
669
700
|
|
670
701
|
.ui-tabs > .ui-tabs-nav > li:last-child {
|
671
702
|
margin-right: 9em; }
|
672
703
|
|
673
|
-
|
704
|
+
.ui-tabs > .ui-tabs-nav > li > a > .section_number {
|
705
|
+
display: none; }
|
706
|
+
|
707
|
+
#_about > table td:first-child, #_about > .validations {
|
708
|
+
text-align: center; }
|
709
|
+
|
710
|
+
#_search_form {
|
711
|
+
text-align: right;
|
712
|
+
font-weight: normal; }
|
713
|
+
#_search_form input {
|
714
|
+
margin-top: 0.25em; }
|
715
|
+
#_search_form input.initial {
|
716
|
+
color: gray;
|
717
|
+
font-style: italic; }
|
718
|
+
#_search_form #_search_start, #_search_form #_search_stop {
|
719
|
+
float: right;
|
720
|
+
margin: 0.1625em;
|
721
|
+
padding: 0.325em; }
|
722
|
+
#_search_form #_search_start:hover, #_search_form #_search_stop:hover {
|
723
|
+
cursor: pointer; }
|
724
|
+
|
725
|
+
#_search > .status {
|
674
726
|
text-align: center; }
|
727
|
+
#_search > .results > .result > .excerpt:hover {
|
728
|
+
background-color: #FFFFE0;
|
729
|
+
cursor: pointer; }
|
730
|
+
#_search > .results > .result > .excerpt:hover * {
|
731
|
+
cursor: pointer; }
|
675
732
|
/*]]>*/
|
676
733
|
</style>
|
677
734
|
|
@@ -713,33 +770,39 @@ a:after {
|
|
713
770
|
font-weight: normal;
|
714
771
|
font-size: smaller; }
|
715
772
|
|
716
|
-
.tabs > ul, .nav, #
|
773
|
+
.tabs > ul, .nav, #_floats, #_about, #_search {
|
717
774
|
display: none; }
|
718
775
|
|
719
|
-
#
|
776
|
+
#_contents, .part, .chapter, #_references {
|
720
777
|
page-break-before: always; }
|
721
778
|
|
722
|
-
#
|
779
|
+
#_header, #_footer {
|
723
780
|
text-align: center; }
|
724
781
|
|
725
|
-
#
|
782
|
+
#_header > .authors_and_date > .authors {
|
726
783
|
margin-top: 1.625em;
|
727
784
|
margin-bottom: -0.25em; }
|
728
785
|
|
729
|
-
.header_outside_above, #
|
786
|
+
.header_outside_above, #_header, .header_outside_below, .logo {
|
730
787
|
margin-bottom: 5em; }
|
731
788
|
|
732
|
-
.footer_outside_above, #
|
789
|
+
.footer_outside_above, #_footer, .footer_outside_below, #_references, #_about {
|
733
790
|
margin-top: 5em; }
|
734
791
|
|
735
|
-
#
|
792
|
+
#_header .header_inside_above, #_footer .footer_inside_above {
|
736
793
|
margin-bottom: 4em; }
|
737
794
|
|
738
|
-
#
|
795
|
+
#_header .header_inside_below, #_footer .footer_inside_below {
|
739
796
|
margin-top: 4em; }
|
740
797
|
|
741
798
|
.part > .title > big, .chapter > .title > big {
|
742
799
|
padding-bottom: 0.5em; }
|
800
|
+
|
801
|
+
.paragraph > .title {
|
802
|
+
margin-top: 2em; }
|
803
|
+
|
804
|
+
._float {
|
805
|
+
margin: 3em; }
|
743
806
|
/*]]>*/
|
744
807
|
</style>
|
745
808
|
|
@@ -786,6 +849,18 @@ jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.bro
|
|
786
849
|
* ui.core.js
|
787
850
|
*/
|
788
851
|
(function(a){a.widget("ui.tabs",{_init:function(){if(this.options.deselectable!==undefined){this.options.collapsible=this.options.deselectable}this._tabify(true)},_setData:function(b,c){if(b=="selected"){if(this.options.collapsible&&c==this.options.selected){return}this.select(c)}else{this.options[b]=c;if(b=="deselectable"){this.options.collapsible=c}this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+a.data(b)},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+a.data(this.list[0]));return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(c,b){return{tab:c,panel:b,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(n){this.list=this.element.children("ul:first");this.lis=a("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return a("a",this)[0]});this.panels=a([]);var p=this,d=this.options;var c=/^#.+/;this.anchors.each(function(r,o){var q=a(o).attr("href");var s=q.split("#")[0],u;if(s&&(s===location.toString().split("#")[0]||(u=a("base")[0])&&s===u.href)){q=o.hash;o.href=q}if(c.test(q)){p.panels=p.panels.add(p._sanitizeSelector(q))}else{if(q!="#"){a.data(o,"href.tabs",q);a.data(o,"load.tabs",q.replace(/#.*$/,""));var w=p._tabId(o);o.href="#"+w;var v=a("#"+w);if(!v.length){v=a(d.panelTemplate).attr("id",w).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(p.panels[r-1]||p.list);v.data("destroy.tabs",true)}p.panels=p.panels.add(v)}else{d.disabled.push(r)}}});if(n){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(d.selected===undefined){if(location.hash){this.anchors.each(function(q,o){if(o.hash==location.hash){d.selected=q;return false}})}if(typeof d.selected!="number"&&d.cookie){d.selected=parseInt(p._cookie(),10)}if(typeof d.selected!="number"&&this.lis.filter(".ui-tabs-selected").length){d.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}d.selected=d.selected||0}else{if(d.selected===null){d.selected=-1}}d.selected=((d.selected>=0&&this.anchors[d.selected])||d.selected<0)?d.selected:0;d.disabled=a.unique(d.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(q,o){return p.lis.index(q)}))).sort();if(a.inArray(d.selected,d.disabled)!=-1){d.disabled.splice(a.inArray(d.selected,d.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(d.selected>=0&&this.anchors.length){this.panels.eq(d.selected).removeClass("ui-tabs-hide");this.lis.eq(d.selected).addClass("ui-tabs-selected ui-state-active");p.element.queue("tabs",function(){p._trigger("show",null,p._ui(p.anchors[d.selected],p.panels[d.selected]))});this.load(d.selected)}a(window).bind("unload",function(){p.lis.add(p.anchors).unbind(".tabs");p.lis=p.anchors=p.panels=null})}else{d.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[d.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(d.cookie){this._cookie(d.selected,d.cookie)}for(var g=0,m;(m=this.lis[g]);g++){a(m)[a.inArray(g,d.disabled)!=-1&&!a(m).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(d.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(d.event!="mouseover"){var f=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var j=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){f("hover",a(this))});this.lis.bind("mouseout.tabs",function(){j("hover",a(this))});this.anchors.bind("focus.tabs",function(){f("focus",a(this).closest("li"))});this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var b,h;if(d.fx){if(a.isArray(d.fx)){b=d.fx[0];h=d.fx[1]}else{b=h=d.fx}}function e(i,o){i.css({display:""});if(a.browser.msie&&o.opacity){i[0].style.removeAttribute("filter")}}var k=h?function(i,o){a(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(h,h.duration||"normal",function(){e(o,h);p._trigger("show",null,p._ui(i,o[0]))})}:function(i,o){a(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");p._trigger("show",null,p._ui(i,o[0]))};var l=b?function(o,i){i.animate(b,b.duration||"normal",function(){p.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");e(i,b);p.element.dequeue("tabs")})}:function(o,i,q){p.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");p.element.dequeue("tabs")};this.anchors.bind(d.event+".tabs",function(){var o=this,r=a(this).closest("li"),i=p.panels.filter(":not(.ui-tabs-hide)"),q=a(p._sanitizeSelector(this.hash));if((r.hasClass("ui-tabs-selected")&&!d.collapsible)||r.hasClass("ui-state-disabled")||r.hasClass("ui-state-processing")||p._trigger("select",null,p._ui(this,q[0]))===false){this.blur();return false}d.selected=p.anchors.index(this);p.abort();if(d.collapsible){if(r.hasClass("ui-tabs-selected")){d.selected=-1;if(d.cookie){p._cookie(d.selected,d.cookie)}p.element.queue("tabs",function(){l(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(d.cookie){p._cookie(d.selected,d.cookie)}p.element.queue("tabs",function(){k(o,q)});p.load(p.anchors.index(this));this.blur();return false}}}if(d.cookie){p._cookie(d.selected,d.cookie)}if(q.length){if(i.length){p.element.queue("tabs",function(){l(o,i)})}p.element.queue("tabs",function(){k(o,q)});p.load(p.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(a.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var c=a.data(this,"href.tabs");if(c){this.href=c}var d=a(this).unbind(".tabs");a.each(["href","load","cache"],function(e,f){d.removeData(f+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(a.data(this,"destroy.tabs")){a(this).remove()}else{a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(b.cookie){this._cookie(null,b.cookie)}},add:function(e,d,c){if(c===undefined){c=this.anchors.length}var b=this,g=this.options,i=a(g.tabTemplate.replace(/#\{href\}/g,e).replace(/#\{label\}/g,d)),h=!e.indexOf("#")?e.replace("#",""):this._tabId(a("a",i)[0]);i.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var f=a("#"+h);if(!f.length){f=a(g.panelTemplate).attr("id",h).data("destroy.tabs",true)}f.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(c>=this.lis.length){i.appendTo(this.list);f.appendTo(this.list[0].parentNode)}else{i.insertBefore(this.lis[c]);f.insertBefore(this.panels[c])}g.disabled=a.map(g.disabled,function(k,j){return k>=c?++k:k});this._tabify();if(this.anchors.length==1){i.addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[c],this.panels[c]))},remove:function(b){var d=this.options,e=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();if(e.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(b+(b+1<this.anchors.length?1:-1))}d.disabled=a.map(a.grep(d.disabled,function(g,f){return g!=b}),function(g,f){return g>=b?--g:g});this._tabify();this._trigger("remove",null,this._ui(e.find("a")[0],c[0]))},enable:function(b){var c=this.options;if(a.inArray(b,c.disabled)==-1){return}this.lis.eq(b).removeClass("ui-state-disabled");c.disabled=a.grep(c.disabled,function(e,d){return e!=b});this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]))},disable:function(c){var b=this,d=this.options;if(c!=d.selected){this.lis.eq(c).addClass("ui-state-disabled");d.disabled.push(c);d.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}},select:function(b){if(typeof b=="string"){b=this.anchors.index(this.anchors.filter("[href$="+b+"]"))}else{if(b===null){b=-1}}if(b==-1&&this.options.collapsible){b=this.options.selected}this.anchors.eq(b).trigger(this.options.event+".tabs")},load:function(e){var c=this,g=this.options,b=this.anchors.eq(e)[0],d=a.data(b,"load.tabs");this.abort();if(!d||this.element.queue("tabs").length!==0&&a.data(b,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(e).addClass("ui-state-processing");if(g.spinner){var f=a("span",b);f.data("label.tabs",f.html()).html(g.spinner)}this.xhr=a.ajax(a.extend({},g.ajaxOptions,{url:d,success:function(i,h){a(c._sanitizeSelector(b.hash)).html(i);c._cleanup();if(g.cache){a.data(b,"cache.tabs",true)}c._trigger("load",null,c._ui(c.anchors[e],c.panels[e]));try{g.ajaxOptions.success(i,h)}catch(j){}c.element.dequeue("tabs")}}))},abort:function(){this.element.queue([]);this.panels.stop(false,true);if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup()},url:function(c,b){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",b)},length:function(){return this.anchors.length}});a.extend(a.ui.tabs,{version:"1.7.2",getter:"length",defaults:{ajaxOptions:null,cache:false,cookie:null,collapsible:false,disabled:[],event:"click",fx:null,idPrefix:"ui-tabs-",panelTemplate:"<div></div>",spinner:"<em>Loading…</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'}});a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(d,f){var b=this,g=this.options;var c=b._rotate||(b._rotate=function(h){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var i=g.selected;b.select(++i<b.anchors.length?i:0)},d);if(h){h.stopPropagation()}});var e=b._unrotate||(b._unrotate=!f?function(h){if(h.clientX){b.rotate(null)}}:function(h){t=g.selected;c()});if(d){this.element.bind("tabsshow",c);this.anchors.bind(g.event+".tabs",e);c()}else{clearTimeout(b.rotation);this.element.unbind("tabsshow",c);this.anchors.unbind(g.event+".tabs",e);delete this._rotate;delete this._unrotate}}})})(jQuery);;/*
|
852
|
+
* jQuery UI Progressbar 1.7.2
|
853
|
+
*
|
854
|
+
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
855
|
+
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
856
|
+
* and GPL (GPL-LICENSE.txt) licenses.
|
857
|
+
*
|
858
|
+
* http://docs.jquery.com/UI/Progressbar
|
859
|
+
*
|
860
|
+
* Depends:
|
861
|
+
* ui.core.js
|
862
|
+
*/
|
863
|
+
(function(a){a.widget("ui.progressbar",{_init:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a('<div class="ui-progressbar-value ui-widget-header ui-corner-left"></div>').appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow").removeData("progressbar").unbind(".progressbar");this.valueDiv.remove();a.widget.prototype.destroy.apply(this,arguments)},value:function(b){if(b===undefined){return this._value()}this._setData("value",b);return this},_setData:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change",null,{});break}a.widget.prototype._setData.apply(this,arguments)},_value:function(){var b=this.options.value;if(b<this._valueMin()){b=this._valueMin()}if(b>this._valueMax()){b=this._valueMax()}return b},_valueMin:function(){var b=0;return b},_valueMax:function(){var b=100;return b},_refreshValue:function(){var b=this.value();this.valueDiv[b==this._valueMax()?"addClass":"removeClass"]("ui-corner-right");this.valueDiv.width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.7.2",defaults:{value:0}})})(jQuery);;/*
|
789
864
|
* jQuery UI Effects 1.7.2
|
790
865
|
*
|
791
866
|
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
@@ -808,26 +883,57 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
808
883
|
*/
|
809
884
|
(function(a){a.effects.highlight=function(b){return this.queue(function(){var e=a(this),d=["backgroundImage","backgroundColor","opacity"];var h=a.effects.setMode(e,b.options.mode||"show");var c=b.options.color||"#ffff99";var g=e.css("backgroundColor");a.effects.save(e,d);e.show();e.css({backgroundImage:"none",backgroundColor:c});var f={backgroundColor:g};if(h=="hide"){f.opacity=0}e.animate(f,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(h=="hide"){e.hide()}a.effects.restore(e,d);if(h=="show"&&a.browser.msie){this.style.removeAttribute("filter")}if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;
|
810
885
|
$(function() {
|
811
|
-
/*
|
812
|
-
%< File.join(ERBook::INSTALL, 'LICENSE')
|
813
|
-
*/
|
886
|
+
/*(the ISC license)
|
814
887
|
|
815
|
-
|
816
|
-
// respond to changes in window location
|
817
|
-
//
|
818
|
-
var $last_hash = null;
|
888
|
+
Copyright 2006 Suraj N. Kurapati <sunaku@gmail.com>
|
819
889
|
|
820
|
-
|
821
|
-
|
890
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
891
|
+
purpose with or without fee is hereby granted, provided that the above
|
892
|
+
copyright notice and this permission notice appear in all copies.
|
822
893
|
|
823
|
-
|
824
|
-
|
825
|
-
|
894
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
895
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
896
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
897
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
898
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
899
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
900
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
901
|
+
*/
|
902
|
+
"use strict";
|
903
|
+
|
904
|
+
//--------------------------------------------------------------------------
|
905
|
+
// utility logic
|
906
|
+
//--------------------------------------------------------------------------
|
907
|
+
|
908
|
+
//
|
909
|
+
// Returns the tab corresponding to the
|
910
|
+
// given panel in the given tabs widget.
|
911
|
+
//
|
912
|
+
function tab_by_panel(panel, tabs_widget) {
|
913
|
+
if (!tabs_widget) {
|
914
|
+
tabs_widget = panel.parent('.ui-tabs');
|
826
915
|
}
|
827
916
|
|
828
|
-
|
917
|
+
return tabs_widget.find(
|
918
|
+
'.ui-tabs-nav > li > a[href=#'+ panel.attr('id') +']'
|
919
|
+
).parent('li');
|
920
|
+
}
|
921
|
+
|
922
|
+
//
|
923
|
+
// Returns a jQuery element containing a jQuery UI icon of the given name.
|
924
|
+
//
|
925
|
+
function ui_icon(name) {
|
926
|
+
return $('<div/>').addClass('ui-state-default ui-corner-all').append(
|
927
|
+
$('<span/>').addClass('ui-icon ui-icon-' + name)
|
928
|
+
);
|
829
929
|
}
|
830
930
|
|
931
|
+
//--------------------------------------------------------------------------
|
932
|
+
// document location
|
933
|
+
//--------------------------------------------------------------------------
|
934
|
+
|
935
|
+
var $last_hash;
|
936
|
+
|
831
937
|
//
|
832
938
|
// Sets the location bar hash to the given value.
|
833
939
|
//
|
@@ -836,14 +942,12 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
836
942
|
// the element corresponding to the given hash.
|
837
943
|
//
|
838
944
|
function set_hash(hash, prevent_jump) {
|
839
|
-
if ($last_hash
|
945
|
+
if (hash === $last_hash) {
|
840
946
|
return;
|
841
947
|
}
|
842
948
|
|
843
|
-
|
844
|
-
//
|
949
|
+
function set_the_hash() {
|
845
950
|
// XXX: bypass on_hash_change() by setting $last_hash
|
846
|
-
//
|
847
951
|
window.location.hash = $last_hash = hash;
|
848
952
|
}
|
849
953
|
|
@@ -876,7 +980,7 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
876
980
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
877
981
|
// THE SOFTWARE.
|
878
982
|
//
|
879
|
-
//
|
983
|
+
// The jQuery.LocalScroll plugin is documented at:
|
880
984
|
//
|
881
985
|
// http://flesler.blogspot.com/2007/10/jquerylocalscroll-10.html
|
882
986
|
//
|
@@ -884,12 +988,11 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
884
988
|
//
|
885
989
|
// http://flesler-plugins.googlecode.com/svn/trunk/jquery.localScroll/jquery.localScroll.js
|
886
990
|
//
|
991
|
+
|
887
992
|
var target_id = target.attr('id');
|
888
993
|
|
889
|
-
//
|
890
994
|
// temporarily place a dummy element at the current
|
891
995
|
// screen position and give it the ID of the target
|
892
|
-
//
|
893
996
|
var original_screen_position = $(window).scrollTop();
|
894
997
|
|
895
998
|
var dummy = $('<span/>').attr('id', target_id).css({
|
@@ -899,26 +1002,17 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
899
1002
|
|
900
1003
|
target.removeAttr('id').before(dummy);
|
901
1004
|
|
902
|
-
//
|
903
1005
|
// when we set the hash, the browser will jump to the
|
904
1006
|
// dummy, which is where the browser screen currently
|
905
1007
|
// is, and therefore the jump will not be visualized!
|
906
|
-
//
|
907
|
-
console.log($(window).scrollTop())
|
908
|
-
console.log(target)
|
909
1008
|
set_the_hash();
|
910
|
-
console.log($(window).scrollTop())
|
911
1009
|
|
912
|
-
//
|
913
1010
|
// undo the temporary changes
|
914
|
-
//
|
915
1011
|
dummy.remove();
|
916
1012
|
target.attr('id', target_id);
|
917
1013
|
|
918
|
-
//
|
919
1014
|
// the above approach does not work for Opera and IE.
|
920
1015
|
// they ignore the dummy and jump to the actual target
|
921
|
-
//
|
922
1016
|
$(window).scrollTop(original_screen_position);
|
923
1017
|
|
924
1018
|
return;
|
@@ -928,35 +1022,19 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
928
1022
|
set_the_hash();
|
929
1023
|
}
|
930
1024
|
|
931
|
-
//
|
932
|
-
// Returns the tab corresponding to the
|
933
|
-
// given panel in the given tabs widget.
|
934
|
-
//
|
935
|
-
function tab_by_panel(panel, tabs_widget) {
|
936
|
-
if (!tabs_widget) {
|
937
|
-
tabs_widget = panel.parent('.ui-tabs');
|
938
|
-
}
|
939
|
-
|
940
|
-
return tabs_widget.find(
|
941
|
-
'.ui-tabs-nav > li > a[href=#'+ panel.attr('id') +']'
|
942
|
-
).parent('li');
|
943
|
-
}
|
944
|
-
|
945
1025
|
//
|
946
1026
|
// Reveals the element at the given hash by (1) activating all
|
947
1027
|
// tabs that contain it, (2) smoothly scrolling to it, and (3)
|
948
1028
|
// updating the hash in the browser's location bar accordingly.
|
949
1029
|
//
|
950
|
-
function
|
951
|
-
var target = $(
|
1030
|
+
function reveal(hash_or_elem, callback) {
|
1031
|
+
var target = $(hash_or_elem);
|
952
1032
|
|
953
1033
|
if (target.length) {
|
954
1034
|
var target_is_panel = target.is('div') &&
|
955
1035
|
target.parent('.ui-tabs').length;
|
956
1036
|
|
957
|
-
//
|
958
1037
|
// reveal all tabs which contain the target
|
959
|
-
//
|
960
1038
|
if (target.is(':hidden')) {
|
961
1039
|
var panels = target.parents('.ui-tabs > div:hidden').get().reverse();
|
962
1040
|
|
@@ -964,28 +1042,30 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
964
1042
|
panels.push(target);
|
965
1043
|
}
|
966
1044
|
|
967
|
-
|
968
|
-
var panel = $(
|
1045
|
+
$(panels).each(function() {
|
1046
|
+
var panel = $(this);
|
969
1047
|
var tabs_widget = panel.parent('.ui-tabs');
|
970
1048
|
var selected_index = tabs_widget.tabs('option', 'selected');
|
971
1049
|
|
972
|
-
//
|
973
1050
|
// map the panel to its tab because tabs do not
|
974
1051
|
// have to be in the same order as their panels
|
975
|
-
//
|
976
1052
|
var tab = tab_by_panel(panel, tabs_widget);
|
977
1053
|
var wanted_index = tab.prevAll('li').length;
|
978
1054
|
|
979
|
-
if (wanted_index
|
1055
|
+
if (wanted_index !== selected_index) {
|
980
1056
|
tabs_widget.tabs('select', wanted_index);
|
981
1057
|
}
|
982
|
-
}
|
1058
|
+
});
|
1059
|
+
}
|
1060
|
+
|
1061
|
+
// scroll to nearest visible element if the target
|
1062
|
+
// is naturally hidden (e.g. because of a CSS rule)
|
1063
|
+
if (target.is(':hidden')) {
|
1064
|
+
target = target.closest(':not(:hidden)');
|
983
1065
|
}
|
984
1066
|
|
985
|
-
//
|
986
1067
|
// scroll to the tab bar instead of the target
|
987
1068
|
// because it contains the title for the target
|
988
|
-
//
|
989
1069
|
var scroll_target = target;
|
990
1070
|
|
991
1071
|
if (target_is_panel) {
|
@@ -996,73 +1076,290 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
996
1076
|
}
|
997
1077
|
}
|
998
1078
|
|
999
|
-
var scroll_offset = scroll_target.offset().top;
|
1079
|
+
var scroll_offset = Math.floor(scroll_target.offset().top);
|
1000
1080
|
|
1001
|
-
//
|
1002
1081
|
// set body height so that any element can be
|
1003
1082
|
// brought to the top of the screen via scrolling
|
1004
|
-
//
|
1005
1083
|
var document_height = $(document).height();
|
1006
1084
|
var window_height = $(window).height();
|
1007
1085
|
if (document_height - scroll_offset <= window_height) {
|
1008
1086
|
$('body').css('min-height', document_height + window_height);
|
1009
1087
|
}
|
1010
1088
|
|
1089
|
+
var pending = true;
|
1011
1090
|
$('html, body').animate(
|
1012
1091
|
{ scrollTop: scroll_offset }, 'slow', 'swing', function() {
|
1013
|
-
|
1092
|
+
// prevent the body of this function from being
|
1093
|
+
// executed twice -- because there are 2 target
|
1094
|
+
// elements in the animation list and only one
|
1095
|
+
// of them actually works in different browsers!
|
1096
|
+
if (pending && scroll_offset === $(window).scrollTop()) {
|
1097
|
+
pending = false;
|
1098
|
+
|
1099
|
+
var target_id = target.attr('id');
|
1100
|
+
set_hash('#' + (target_id || '_reveal' + Math.random()),
|
1101
|
+
target_is_panel || !target_id);
|
1102
|
+
|
1103
|
+
if (callback && typeof(callback) === 'function') {
|
1104
|
+
callback();
|
1105
|
+
}
|
1106
|
+
}
|
1014
1107
|
}
|
1015
1108
|
);
|
1016
1109
|
}
|
1017
1110
|
}
|
1018
1111
|
|
1019
|
-
|
1020
|
-
//
|
1021
|
-
|
1022
|
-
|
1112
|
+
//--------------------------------------------------------------------------
|
1113
|
+
// search engine
|
1114
|
+
//--------------------------------------------------------------------------
|
1115
|
+
|
1116
|
+
// Adapted from the source code of the ":contains" selector from
|
1117
|
+
// the "Search on this Page" plugin by Waldek Mastykarz
|
1118
|
+
// <http://blog.mastykarz.nl>, which was (1) published online on
|
1119
|
+
// 17 November 2008 at <http://www.endusersharepoint.com/?p=951>
|
1120
|
+
// and <http://blog.mastykarz.nl/search-page-jquery/>, and was
|
1121
|
+
// (2) updated to work with jQuery 1.3 by "anonymous" here:
|
1122
|
+
// <http://stackoverflow.com/questions/187537>.
|
1123
|
+
jQuery.expr[':'].matches = function(a, i, m) {
|
1124
|
+
// compile the regexp during the first call to this
|
1125
|
+
// function only, so that subsequent calls are fast
|
1126
|
+
if (typeof(m[3]) === 'string') {
|
1127
|
+
m[3] = new RegExp(m[3], 'i');
|
1128
|
+
}
|
1129
|
+
return jQuery(a).text().match(m[3]);
|
1130
|
+
};
|
1131
|
+
|
1132
|
+
$('.tabs:first > ul').append(
|
1133
|
+
$('<li/>').append(
|
1134
|
+
$('<a/>').attr('id', '_search_link').attr('href', '#_search').
|
1135
|
+
text("Search")
|
1136
|
+
).hide()
|
1137
|
+
).append(
|
1138
|
+
$('<form/>').attr('id', '_search_form').append(
|
1139
|
+
$('<input/>').attr('type', 'text').attr('name', 'q').
|
1140
|
+
addClass('initial').attr('title', "Search with regular expression").focus(function() {
|
1141
|
+
var box = $(this);
|
1142
|
+
|
1143
|
+
if (box.is('.initial')) {
|
1144
|
+
box.val('').removeClass('initial');
|
1145
|
+
}
|
1146
|
+
}).blur(function() {
|
1147
|
+
var box = $(this);
|
1023
1148
|
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1149
|
+
if (! box.val().match(/\S/)) {
|
1150
|
+
box.val(box.attr('title')).addClass('initial');
|
1151
|
+
}
|
1152
|
+
}).blur()
|
1153
|
+
).append(
|
1154
|
+
ui_icon('search').attr('id', '_search_start').click(function() {
|
1155
|
+
$('#_search_form').submit();
|
1156
|
+
})
|
1157
|
+
).append(
|
1158
|
+
ui_icon('cancel').attr('id', '_search_stop').hide().click(function() {
|
1159
|
+
$(this).attr('clicked', 'clicked');
|
1160
|
+
})
|
1161
|
+
).submit(function(event) {
|
1162
|
+
event.preventDefault();
|
1030
1163
|
|
1031
|
-
|
1032
|
-
|
1033
|
-
set_hash(hash, true);
|
1034
|
-
}
|
1035
|
-
else {
|
1036
|
-
reveal_hash(hash);
|
1037
|
-
}
|
1164
|
+
var search_box = $(this).find(':text');
|
1165
|
+
var query = search_box.val().replace(/^\s+|\s+$/g, '');
|
1038
1166
|
|
1039
|
-
|
1040
|
-
|
1167
|
+
// ignore empty queries
|
1168
|
+
if (search_box.is('.initial') || !query.match(/\S/)) {
|
1169
|
+
return;
|
1170
|
+
}
|
1041
1171
|
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1172
|
+
// detect invalid regexps
|
1173
|
+
try {
|
1174
|
+
new RegExp(query);
|
1175
|
+
}
|
1176
|
+
catch(e) {
|
1177
|
+
alert(e);
|
1178
|
+
return;
|
1179
|
+
}
|
1180
|
+
|
1181
|
+
// one search at a time
|
1182
|
+
if (search_box.attr('disabled')) {
|
1183
|
+
return;
|
1184
|
+
}
|
1185
|
+
|
1186
|
+
search_box.attr('disabled', 'disabled');
|
1187
|
+
|
1188
|
+
// begin the search
|
1189
|
+
var status = $('#_search > .status');
|
1190
|
+
var results = $('#_search > .results');
|
1191
|
+
|
1192
|
+
// display the search results tab
|
1193
|
+
$('#_search_link').click().parent().show();
|
1194
|
+
|
1195
|
+
// clear previous search results
|
1196
|
+
results.text('');
|
1197
|
+
status.text("Searching...");
|
1198
|
+
|
1199
|
+
// timeout allows status updates to appear
|
1200
|
+
setTimeout(function() {
|
1201
|
+
var num_results = 0;
|
1202
|
+
|
1203
|
+
function emit_result(match) {
|
1204
|
+
// exclude matches from previous search results,
|
1205
|
+
// the table of contents, and jQuery UI tab bars
|
1206
|
+
if (match.closest('#_search, #_contents, .ui-tabs-nav').length) {
|
1207
|
+
return;
|
1208
|
+
}
|
1209
|
+
|
1210
|
+
var excerpt;
|
1211
|
+
|
1212
|
+
// resolve tab panels into their section title
|
1213
|
+
// because additional matches, which lie within
|
1214
|
+
// the content of these tab panels, will come
|
1215
|
+
if (match.is('.ui-tabs-panel')) {
|
1216
|
+
excerpt = match.find('.title:first').clone().show();
|
1217
|
+
}
|
1218
|
+
else {
|
1219
|
+
excerpt = match.clone();
|
1220
|
+
}
|
1221
|
+
|
1222
|
+
// highlight the query inside the match excerpt
|
1223
|
+
excerpt.html(excerpt.html().replace(
|
1224
|
+
new RegExp('(<[^>]*)?(' + query + ')', 'ig'),
|
1225
|
+
function($0, $1, $2) {
|
1226
|
+
// only highlight if not inside an XML tag literal
|
1227
|
+
return $1 ? $0 :
|
1228
|
+
'<span class="ui-state-error">' + $2 + '</span>';
|
1229
|
+
}
|
1230
|
+
));
|
1231
|
+
|
1232
|
+
num_results += 1;
|
1233
|
+
var result = $('<li/>').addClass('result').append(
|
1234
|
+
$('<blockquote/>').addClass('excerpt').append(excerpt)
|
1235
|
+
).attr('id', '_search' + num_results).click(
|
1236
|
+
function(event) {
|
1237
|
+
event.stopPropagation();
|
1238
|
+
|
1239
|
+
// save this search result's hash in browser history
|
1240
|
+
// before revealing the matching element so that
|
1241
|
+
// the user can press the back button to return to
|
1242
|
+
// this exact spot in the search results listing
|
1243
|
+
reveal(this, function() {
|
1244
|
+
if (!$(event.target).is('a')) {
|
1245
|
+
reveal(match);
|
1246
|
+
}
|
1247
|
+
});
|
1248
|
+
}
|
1249
|
+
);
|
1250
|
+
|
1251
|
+
// show bread-crumb trail for the match
|
1252
|
+
var first = true;
|
1253
|
+
match.parents('.ui-tabs-panel').each(function() {
|
1254
|
+
var panel = $(this);
|
1255
|
+
var tab = tab_by_panel(panel);
|
1256
|
+
|
1257
|
+
if (tab.length) {
|
1258
|
+
if (!first) {
|
1259
|
+
result.prepend(' ⟩ ');
|
1260
|
+
}
|
1261
|
+
first = false;
|
1262
|
+
|
1263
|
+
result.prepend(tab.find('a').clone());
|
1264
|
+
}
|
1265
|
+
});
|
1266
|
+
|
1267
|
+
results.append(result);
|
1268
|
+
|
1269
|
+
// unhide any hidden elements in the search result
|
1270
|
+
result.find(':hidden').removeClass('ui-tabs-hide').show();
|
1271
|
+
|
1272
|
+
// remove tab bars (used for titles) and mini navigation menus
|
1273
|
+
result.find('.ui-tabs-nav, .ui-tabs-panel > .nav').remove();
|
1274
|
+
};
|
1275
|
+
|
1276
|
+
var matching_elems = $('#_body').
|
1277
|
+
find(':matches("'+ query.replace(/"/, '\\"') +'")');
|
1278
|
+
|
1279
|
+
status.text('').progressbar();
|
1280
|
+
var start_button = $('#_search_start').hide();
|
1281
|
+
var stop_button = $('#_search_stop').show();
|
1282
|
+
|
1283
|
+
var prev_match;
|
1284
|
+
var prev_elem;
|
1285
|
+
|
1286
|
+
function process_match(i, n) {
|
1287
|
+
status.progressbar('value', Math.round(i / n * 100));
|
1288
|
+
|
1289
|
+
var elem = matching_elems.eq(i);
|
1290
|
+
|
1291
|
+
// ascend to a larger container for more context
|
1292
|
+
var match = elem.closest('pre,ul,ol,dl,table,p,div');
|
1293
|
+
if (!match.length) {
|
1294
|
+
match = elem;
|
1295
|
+
}
|
1296
|
+
|
1297
|
+
if (
|
1298
|
+
prev_match && prev_match.length &&
|
1299
|
+
match.get(0) !== prev_match.get(0) && // unique matches only
|
1300
|
+
elem.parent().get(0) !== prev_elem.get(0) // leaf nodes only
|
1301
|
+
) {
|
1302
|
+
emit_result(prev_match);
|
1303
|
+
}
|
1304
|
+
|
1305
|
+
prev_elem = elem;
|
1306
|
+
prev_match = match;
|
1307
|
+
|
1308
|
+
if (i < n && !stop_button.attr('clicked')) {
|
1309
|
+
// timeout allows status updates to appear
|
1310
|
+
setTimeout(function() { process_match(i + 1, n); }, 0);
|
1311
|
+
}
|
1312
|
+
else {
|
1313
|
+
// handle the last item in this two-stage prev/curr loop
|
1314
|
+
if (prev_match && prev_match.length) {
|
1315
|
+
emit_result(prev_match);
|
1316
|
+
}
|
1317
|
+
|
1318
|
+
status.progressbar('destroy').text("0 results".replace('0', num_results));
|
1319
|
+
|
1320
|
+
search_box.removeAttr('disabled');
|
1321
|
+
stop_button.hide().removeAttr('clicked');
|
1322
|
+
start_button.show();
|
1323
|
+
}
|
1324
|
+
}
|
1325
|
+
|
1326
|
+
process_match(0, matching_elems.length);
|
1327
|
+
|
1328
|
+
}, 0);
|
1329
|
+
|
1330
|
+
return false;
|
1331
|
+
})
|
1332
|
+
).after(
|
1333
|
+
$('<div/>').attr('id', '_search').append(
|
1334
|
+
$('<p/>').addClass('status')
|
1335
|
+
).append(
|
1336
|
+
$('<ol/>').addClass('results')
|
1337
|
+
)
|
1338
|
+
);
|
1339
|
+
|
1340
|
+
//--------------------------------------------------------------------------
|
1341
|
+
// create print preview toggle
|
1342
|
+
//--------------------------------------------------------------------------
|
1343
|
+
|
1344
|
+
$('#_header > .authors_and_date').append(
|
1046
1345
|
$('<span/>').addClass('printer_friendly_toggle').append(
|
1047
|
-
$('<input/>').attr('type', 'checkbox').
|
1346
|
+
$('<input/>').attr('type', 'checkbox').
|
1347
|
+
attr('id', 'printer_friendly_toggle').click(function() {
|
1048
1348
|
var checkbox = $(this);
|
1049
1349
|
|
1050
1350
|
function change_media(src, dst) {
|
1051
1351
|
var styles = $('style[media="'+ src +'"]');
|
1052
1352
|
if (styles.length) {
|
1053
|
-
//
|
1054
1353
|
// try changing the media in-place
|
1055
|
-
//
|
1056
1354
|
var before = checkbox.offset();
|
1057
1355
|
styles.attr('media', dst);
|
1058
1356
|
var after = checkbox.offset();
|
1059
1357
|
|
1060
|
-
|
1061
|
-
|
1358
|
+
// but if that did not work
|
1359
|
+
if (after.top === before.top && after.left === before.left) {
|
1062
1360
|
// try reinserting the <style> into document.
|
1063
1361
|
// this works in Webkit browsers, which ignore
|
1064
1362
|
// the in-place changing approach tried above.
|
1065
|
-
//
|
1066
1363
|
styles.each(function() {
|
1067
1364
|
var style = $(this);
|
1068
1365
|
var parent = style.parent();
|
@@ -1084,21 +1381,25 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1084
1381
|
}
|
1085
1382
|
|
1086
1383
|
return true;
|
1087
|
-
})
|
1088
|
-
).append(
|
1384
|
+
}).css('margin-right', '0.3em')
|
1385
|
+
).append(
|
1386
|
+
$('<label/>').attr('for', 'printer_friendly_toggle').
|
1387
|
+
text("Printer friendly")
|
1388
|
+
)
|
1089
1389
|
);
|
1090
1390
|
|
1091
|
-
|
1092
|
-
// activate
|
1093
|
-
|
1094
|
-
var data_uri_by_embed_uri = {"84731990":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAFVBMVEVmmcwzmcyZzP8AZswAZv////////9E6giVAAAAB3RSTlP///////8AGksDRgAAADhJREFUGFcly0ESAEAEA0Ei6/9P3sEcVB8kmrwFyni0bOeyyDpy9JTLEaOhQq7Ongf5FeMhHS/4AVnsAZubxDVmAAAAAElFTkSuQmCC","84731598":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIkSURBVDiNjZJNSxtRFIbfc+cjmZkkfjSCEFuQtghCwUWj0KXb/IQs3GlBKBQ3waWLoNBfIBSkJYI/ILsupIsuGrIqLQGRoEak6KLNmExzZ+aeLuJMZ4oLz+7e97nPORwuMTMeUvOVvTrAW0TUZua1brN2AgAUCVZeH9aZeUsToh2Eaq21Xz3593h3U9P1vcKjojPyPDV0+z0wL3abtYEAgOWNxmYmY7x5ufTMnCsVV4QQn8rrDSduT7STny46mm7AzheEputTAFYBQIxz2llceOxYVgZP5maEbZkxMF/ZnQVg64YR+8xM1gbwCgBEeb0xC8B27GwMTE7mbKIxAKCsG8YouQ/dNDUiEU9QzjnZFFDIWZqmaauRwDAzuf8EYFYvYsFEwUkB+ZyFMBwDADwAKpmzYoDIiwQeM6eAMFQggnd37ARSDpN54EsQqB0JOreDPynAHXgQQrRjQeBrKYGUklkdA4AOoDMcjlKA63oyCMLju+MpK2XfXF4kERPA10hwKv3A/vzl+71At1mTAFINkkUP+crzld0egFLiyu82a2Y0AZY3DnvMnAJa+1Uz7kJ0npuaLmUsG74coX9zfRVlOgBogs6fPy2VZooT6LtDfPtxdpWQgZkPPLe/JDTdGvb7koGjKBMAEITq4OLyxnNvPZxdXEtmPkK6PgS+/+739c9bX47eg7me2kF5vZElom0Ab4noo1Jqu7Vf/XXPLkS3WUv9mb/vR+THZPMfuQAAAABJRU5ErkJggg==","84731220":"data:image/png;base64,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","84730758":"data:image/png;base64,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","84730296":"data:image/png;base64,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","84729764":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAmCSURBVGiB1ZltbJXlGcd/9/N+Tlssh1JahNEJaK2UFxFptqC2wGCSTWdM3DSQzWVDEzVxy4xfjNkHQ8xMnEEXviwZ62Rj6siWTcVBZeJA5yBQpOWlKNZSaEvpyyk95zwv970Pp+fY5/S0tFBkXsmTc67neu77+f/u6349Ryil+Cqbdq0FXKldEuClp+3nfvVz/eJLT9vPXQv/igFc13tqw4/ujLqu99S18C9lRr6br7zyyi2WZb2eSqUqpVSUlE5BSmW8/PLL6sv2bdtuTiaT9z/++ONN486AZVm/XLiw+qZlt98Wun/bsqUhf+nSJSF/ya2LQv6ixQtD/sJFC0L+guqqkF91S2XIr6y6idlfm1Vp2/Yz+XSOCiCEqDJMQ3ze+hm6bnC+sx9d1zl+vBlN1znf2Y+m6TQfa0LTvvCbmo6G/KNHj4T8Ix83hvzGI4dD/uHGQyG/peUElmUJIURlPp2jAkgpiwXg+R5FM9dRv3U/heXrkFJSWHZ32i/7NlJKCsrWUr91P9EZa5FSEildQ/3W/USmfwspJc701dRv3Y9dshopJda0VdRv3Y8VW4mUEjO2kvqt+zCm1iGlxCiu5fe/24defBeu6yHSkopHAxD51oEtW7bEb1++rLC5+ShBEKCU+uJCgWJCvlJD9/iinlw/o2O4b5omixct4fixkz2PPPJILB9A3kEspYzOmjWbxYuWjIiNtfBdjdjg4EWam44XjhYf0YU2b948xTTNoGRaSbjlR2mlqx0rLCxC0zR98+bNdj6AERkIgiDmOI6nlDK/7NbOF1NKYdt2KplMxoCzufERAKZpxiKRSDC8wnfeeWfUl06W0FxbtWpV9tloNOoPDg6OD0BKGYtEIqGXrV69etKFXio2vGs5jqOklOMbxJqmxaLRqBheSRAEo77sSoWOZkKI7DORSERomjY+AKVULBKJGMMB3n333Uum/XK35aOVq6ury2YiEonoSqnxAziOYw0HqKurG5fIyR68mU/Hccyes8cq19cVbQB84Fh9Q/xgXgDTNGfYtq0NBxivkMmGAGg73cTOV58xe9tPPvnwuodUxFX89cOd/vq6orX1DfG9IwB0XS+zbTs0kHbt2jVhiMwscrkQrS2H+ce2TfSdPc2Dd9xN1cL7TK29E9rbWWBXWk9o+95eX1c0Jd9KXGqaZghg5cqVExIyEaG51tL0IW9u2wRuijVrf4JXXIHR1oZoaIC2NjhzBtHbS+lcTT9jBNPzAUyzLCvUBy9HyETLHm98nze3bWKw7xy1NZXcOG8JUmq0BgGtpaVoRUWUfPwxnb5Pl+/RJ6QAIvkGcXFuBq4mxNEDu3lr2yaUN8BdyyuZO/d2hNBQ0sPrf43C0yvoqqjic9umdXCQ85akeT6plMUL9f+Mf5pvIZtiGAa5g3gyIZRSNH74Nm/9cRO2HrByeSUVFRWAQAYpEj2nSF44hZI+F/tn4V0/n3hPJ+1Vym+KKFcY4lXPU89A/r1QgWEY+L6fvbd79+4rhkg/Izlz8j+c/O/rlBRHufuOBcyeNRsA6Q+S6G4h1XcaJdMLZ0evT3tXG/65VznU9j5eofqN5/N8/c7+9kydofPAiy++GIlGo/ENGzborutOWOhosSDw+ehfb7Dzzy9QVjKFO5bdTHl5eTrmxklcOEmq73NQEqmgvduj5axLR5/GRVdQd89G2uMFsqd3wH722Wf94XWHMhCJRGK2bbtAZDLmc99z+aDhT+x6/dfMmTWdH3znG5ROL03HUr0kzp/AjbcDikAqWrt8TrWn6IgbSC1K3b2PsbzuAQqLrmP79u2u0KypQNeoAL7vxxzH8XMHb0NDw4Qh2k99RPO//0DlvNlsuL+WabFpAHiJbpLdx3EHOgBwfcVnnR4t7SnO9Qk0q5Ablt7Lgz/+BZqmZ+uzbdsfGBiIjQkwtI1QuTNQbW3tJVt7uB14bwcfHdnBxofvoTgaBQTuxXMkuk/gD3YDkHAVn55z+eRcis64QUnZXB7Y8DNuXnzXiNlvaD+kDMMYsR8akQHTNIWU8rJnoAN7d7DrtefZ+MSjRGfMI/HpPuInd+EnewGIJySnzrp81unRGRdU3LiUHz76JBU3LhkhOmNSShzHId+WOgSQTCZjlmWFdqIAe/bsGdcs03ZiH62H/sJPH12PXXAd0r2IXVZFz5E36BkIaDnr0trl09kXUF6xiOW191BYXM7p9j5Ot+8J1XXnnXeGYEzT1F3XHRsgCIKYZVlmLsCKFStGtMqwMvi+z4H3dtD1yXus+e59WJaBn+hBc+MoBUfaFM2nk1y4KKlaupq1teuZWjITwzDQdR3DMDAMA9M0s/UOFy+lxLZtw/f9sQE8z5tu27aR24UyhwshROiQ47ourutyaN/f2Pv3Lew9fJ7Dxzr4/pqv0xt36e4ZoOt8D6mUy7zFa6m5dR0FRVPxlUFvby+maWJZFqZpZr9blkVmIR0OY5qm6XnetDEBlFLllmWNaO29e/eS8xy+7+P7Pm0nPuD4B9soKCxkzTdvoOC6Ms755TglMWZ+bSpzIsWYzhR0XSdQOslkksw7hBAIIdA0LfuZ2cbkvs80TaGUKh8TwPf9UsuykFKGIGpqanLLZVPbffNcvvfQY3heGsjzPDzPy3at3Exqmoau6+i6jmmaGIaB4zg4joNhGKEsZ0xKyZCuGZcCKMnsRIf3QV3XRwBkYmUzK0JAmSsIguz3fK2t6zqapqFp2og6873Hsiw8z5s+JkAqlZqaycDlTKO5gsZTbjynvkwGXNedOiaA67pT8gFMBOJqxDIAqVRqxI+8IYBEIlE4lKoJn4evZiwDkEgkinKfyeZ748aNpuu6pmma2QzkXplKv+yYlBLTNEkmk86CBQus4QDZDDQ2Nl4/f/5817Isp7S0NDv3T6aNZzUfzXzfRwjhK6XmCCHOAoNKKWkACCEKqqurpwkhZEtLC42NjZOledKsuroaTdOU67olwACgCSEGDCGEBdiu6zq+75NMJkNL+v+LJRIJfN8nkUhEgAgQAK5BehzoPT098e7ubj2VSjFnzpxrKjafSSm5cOEC/f39KUAnrVsTgAkUAYU1NTUPx2KxjUEQTLmWYvOZpmnxjo6O3x48eHA76S4UB3qEUgohRBQoGLoyKTJJp+nyR97kmA1IwANSwODQ1auUSmYP9UNjoQBwAIv0DBUMFb6WZpNuRB9wSYsfUEr5kOdfSiGETrr1DUCQhrhWJkj394A0gKeUCjVo3r9Zv0r2P3yyQqPd16MPAAAAAElFTkSuQmCC","84729302":"data:image/png;base64,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","84728784":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAU3SURBVGiB7VlPaBRXHP5+82aTSLIrkY3YJR68VmuSPXlRPPQPGg05iD14sZfEUkpbPJQqQVJs0yQlkEDobaE9CaloTlI0InhYNOBi2yAFT0JxZW2ysn/cmTczvx4ym+7Ozs7uzK6kQj54zOzvzbz3fe/3583MEjPjbYay3QRaxY6A7caOgO2G2uoAExMTB4QQVy3LGrEsq+XxnFAUpcDMCVVVv71y5Ure2d/yhKqqLgwPDw8PDg6SEMLzWj8lu3ytlLLr9u3bXzx48OAlgJma+f3Rrcb4+HgoGo1+FI/HSUoJKWVDQpXnThsR1fSHQiEcP36849GjR2NtFxCLxYSu64qiKDBNsyXyAGBZVo3NNE2EQiEA2OU2dttj1gkvwn766+GNCvAi50eQF96IgCCrHVRQ2wW0Sq7tHhgfHw/FYrF69bELAAzDgGEYvsipqtoU+cA5MDExcUBV1Z/27t37vld97+rqEtPT056TOCGlRF9fH44dO4b9+/cHTmDAQ4AQ4uqpU6c+jMfj5Itdk0in07h27RrOnz+/ZWurByzLGjl8+DBpmlZVn5tBo/AhIuzbtw+GYSCfz6OnpycQ+UYCVCEEDMNoG/GKscHM6O7ursodv+Q9BfhBOypL0ErUsoBmCDda2WbKLTO75mJgAX43paB7QYWdiIjYsQK+X2gqB3WbqFmbc0wvQfZvBUC3815fHggaLl4hREQgoq1KV36kLh/LhYSZNQCdAKpeapoS0I5wqSciEokgEokgm80CAHbv3g0hxNY1hmHg3r17xvr6+q9u3BoKCLrCzfRJKTE3N2devHhRhMNh5HI5qKqKyclJSCl1+7bSxsbG8srKys8AXgcS4IzddnmEiEpPnjz5anFxcebChQvhPXv2AAA0TeOFhYUjxWJRBWAAKADYcBPQVBK3kqxeNgD86tWr35PJ5Oj8/PxGMpnUmRnRaLR09uzZAQAv7ZYB8I+zAgFtDiG/HiEi7u3tzV+/fn0tm82+p+v6lw8fPvyso6Ojo7+///uDBw8eWltbKwKo+7Ld0AOVIeRczRZXHwAgpRQA1GQy+Xp2dva7W7duHXr+/HnCNM2+EydOfAqAsLnQgohUIqri/EZDyE20Y1wqFoudAEI2SfXOnTvZqampr58+fTrAzO+cPn26z+ap2GIUKtdY1AkhIlIvX75cQ8rt6MfmNlWpVOqyyVU+8vLS0tLfAL5x2AGgasB6OdBJRKZpmnB+MqncdCptdlWpjO8tmxOKokBRFORyOWiaxrYAaZOz7GP53Ko4N5m5avIaAUQkAKi6rv+WSqVG4/G4UvlGJqVEPp+HEAKRSKSOfm9YloVnz56hUCi8XF1dTdvkpIN8pQDLrQK5CijrSCaT05ZldS4vL3/AzAIADQ0NWaOjoyoRIRwO4+7du3JlZUXA4dZGsPPhz8ePH/8AQLPb6zLxemRdibo8mxCAHrt1A+gAwGfOnDly7ty5xZGRkV0AsLq6Km/cuLGWSCQ+yWQymh8B+C8hS9jcpHLMXPPhthnUeICZmYh0bK4KAdABcCwWG+jv71dN08TNmzdLqVTqr6WlpY8zmUzN7uhDgG6LKAYhD7h4YKuDqBObn03EyZMno4ODg38cPXpUSaVShRcvXkwmEolfcrlc/Q+i3ignlQ6gyMxBx6m/EzOzZntCDAwM/AgA9+/fn02n01OJRKIQdEIbyuYUwYmXUdcDZVy6dOldZv7cNM3JmZmZdKsTth3OXdPZxsbGQo2u2c7W0AP/d7z1f/LtCNhu7AjYbrz1Av4F8/cV1apw1zkAAAAASUVORK5CYII=","84728322":"data:image/png;base64,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","84727874":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAJOgAACToB8GSSSgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAS1SURBVFiF7ZddbBRVFMf/596Z3W3rtiwtUFsJFQhWMQSIWi0UKJHPlISvCGpiogkxig8SlBSj0Rij6YMPJhB9IyZqTFRC4pNKAgElplSIsRURRL6xtLRLu53dmbn3Hh9mFrZ1Kcs2pi9McnJndu8953c+7rkzxMwYz0uMq/W7AACssSpofo2qlJQfW6X66QNvs7rT9WOKQNP22Kz4xNqOadX1y1CkM0UDLH7dXlo3ddahV9a9O62m6n6/WD1FUS9qtbbMe6i5bUXDxkR/5h+AijVfBEBTa+TD1Q3PbJlX3xQ/39eFeKyyeOt3AvDIi2THJsivn1u5fUXt5LroxeRJMBjA2BoZFdIJm7fRBHFP+f4tLTvnRksism/oCjQrKOOjIlaFgWTSOX3pj0FmRiAGBszMBgyG1gqdZ38+cvh9tWGk7ttG4IltJXWTJtbsf37NjulplaSeVDeYDTRrGKMw6PahrKK89OH43FJjVAimYFhBax/aKFRXTEfn3+2T8+kfFaDpjUhD3X0z9m5e9lJNz9A5eCoDRughGxhoeF4ag+41aKOgtA9tfCgzfCwvmXRLG7cEWNRqbZ5d9+iulY2bKi8ku6CMAhGBmQFigAIAIzTYaLBQYFYwRsGwzhGD0eokL0DTzug7jXNWvjq/fkHFqd6jAANEwV4jQQEAgvwaykIoMGmwMGCjoTkACUZTOMDCndaelsZnn5oyubr0VE87iAQIBCKCEHRjyxOFBcY+UqofQ24SaX8IMACMALGEhRKAGYZ14QAEOL3XL2urzCDpdKMsloCAgLAEBBG0ceF4STg6ibRKwtVDYV0w2ABGM4xmaMUwiiE4ghnevFB1AQCHP1BbF7dG/pw+MPutWTNnVnZc/A5CANFoDBAaWmQgJUFIAkmCsAPdzATWDKIcUwwo30VGOQCDiEgyDw9H3rPgUJu/u/PEby8cO97R3TB1DWw7AtcMQlEGQhKERRA2QVqhhPfCDv4bBigDGmYIABEikqMCEJEAYHXs0ge62i+tPXjk+/Pz713FidIpECJQPsywLSAtcQNCWrnGEdTNzeBbACyim7/k2wUiFHlir//X4LneFtfd9+Xy5pYHrnKX7PXOQsjQS4tQYpcjEa0J8m+CvGvF0L4JR0ZpJA4wKEc3Idybt+uEdPEX9F0/l1rvet988uSS1Y+XJxKxC86vAYQlUFlWC75alT5/+kImaMPgoMOb4KQwxNdwlJlNb14DI8+CMEeRUOyc0X5sq/3mwgWN62vrE/HTqUOQNqEmXo8zR5z+z3Yc35BJwgGgAPiheCPus88uh4b/UwNhlepQ0TBp3+2/d/CHn9p+bz/TP2fialgyEuRYgEnCAZAB4OYYG6lDA/A4x+tbpWDkG07Q+gB9bI/63OvvOjXgDHy0fMWq6hRdBsNhIZEOAfI5kI1Chnl4W8wLEBJ6RGSyhsO5EoDs3Kd/TCUvrXOcb7/YuHZTHXE3ywgcAOlwfnbNDa9Hen67CGRBFAAV1oWdBQAgzh70T7rXe5pd79OvonbJg5E4hsII5AJ4AHQ+wwUB5IBkw4pwDwsAdOU4UiQGl8xc6r3cK3AtnMPBksK++Qp6I/o/r3H/MroL8C8JiYMXQa6AIwAAAABJRU5ErkJggg==","84727398":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAJOgAACToB8GSSSgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAASrSURBVFiF7ZdtaFZlGMd/133O2dgcmunUZDgzzIYvJIH2wU2UtDKKXkCCLIqiDyIWZfhCEYIRCUIgUvYhApMKKoUMDd9ymagzNHTGZNlSp5tz0z17e55zzn1ffXjOo8/WZuqH+SEfuLgOPPc5/9/1v677PhxRVW7nz9xW9TsAtwowZ7X4Ve/4i24bAFcoKb173MZH3h2yY8FSKRx8AGDqhBnpt57/eJ43aszhqqVSOugATh1i1Cx+ZvW0svEVNbNWFE4eVABVR1d4mfOpehY9+kb5tAkz9lSu8J8cNACnjshGpOMOTrcdY/7Dz42a/eBTmyqXFy6/medIfydh1Ur/64pxM+cGnq8igogICCJylXtieUXJsGF3FbV2NeLUouoYM3QCF1uaurfu//zb6oLoFX1f3S0BVK4q2PPmwg/mXOo6h4jBE58siMHINdNS6VbSUReKw6nDOcvw4tH4tij6ZvdnB21rasHeDdp5PQB/oD+6wxSN7acScYMRL8kCJE4IqCqqDtUsRHNHA8XB0OCFx5bM2rL3iyOz35Z5+9bp2YF0BpwBq5bYhkQuQ+ySbDPZTAYrIY4MTrLXlpBYM8Q25HJPMw1Xjsqzc1+aVFY26UDlqoKZNw3gXEzswiyEzYrHZHAS4gixksFKhJMIJyFWQjKuk/boIq1djbR0nuXYhd3Mnvl42eTxD22rXO6/2J/OgC2wGhO5ECMeBoPxPXwEMMk8CKHtpjPTRmfUTjrsxFqLs4qLFRtnZ6vxSh3Tx88fOaxk2PqqlYUV1R9mVt0QQCbupivTjmd8giDAOEirRV1M5Hrose3EGmYXK4gPngi5jaKAi5XQprmQqqe0ZGKh58mUG3NAkY50G80dfyEGvMDg+YLnC8YXjCcYD7zcjlAQp7icuCbhlIpRs4hSfuqnmu+/PLDWLmFNb6l/zYCIeFwdczBGMIasaALh+YIXGPxA8APBC6Q3oC/4vseM8idoOdfe9uuhXe8dWGuXAd51HcgeOHiqWQAREC9X8bXwEhfEZDnVKbndqQoFUszU0fM4WHOo6dSxhsW/b3bViZaKiNW8w6dvCwzgoUhRUELZ8PsxgcH3kyoDk3UhAUnFTaRtJ+queVbij2BicZXu3PPT37W7Wl9u+MXWX30u2CTHAwEkPXSttX8cvySmGBHIgKiIGAMogiDjxo8tHDHSL2rqqcM5AXWMKCyn1E2Jf9ixpfbIVx2vtZ+mLUHLtVT6avU6ikXEAAVAkOT86yA/Xv10+rb7ZhWPaOqpw8WOewqn4pqH9+zYuX1/zcbMsrCLHiACwj45rXrtHdHLAVV1ImITy2xiVX4FCjjAiqDGCL5vuHdIJQ3H21LVP/+4ueaTaH1yX5REnIQFonzxflugqlEyjPmiOeE4uccgqMHngSHzObzvRMtv1bVrjm6KtueJ5SByOa2qcV+9AWZAQxFxuWqT8MkOkAGMgI71prN123fnTlY3vn5yqz3RZ30OIgYyqmr70+r3ddxrQfZcCK5WnsTTH5X9GUXp83W7Ly2s30tznks5iIh+LL8hB/q4YQGb1xYDyKXLFzec2R+uO7Ofnj7i+l+ivQq88234vwf4B6YlTDQudkyaAAAAAElFTkSuQmCC","84726992":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABSlJREFUWIXdl1lsVUUYx/8zc7a7daUroXQhlkpoQ4sVA8b6gilbIEIDggEiEiSRFwzEJ/pCXXjgQR8sAW0I0QQSicZIiC9IsClFFqlC6HorXW/Xe+/p7b3nnpnxobbpJW1pS+uD3+N3vpn/b2b+c853gP9rrNp1WZtNHVlo4ZLDl/YzkC+lhAMUZ+9Uv3MCIHK6eraQ4sXvX9ri0tVvD2wtMt4oyaZPvP1rE1bf93ff/f72dGMWbAcKj1xMNYTSeGh7cbxUFNhcQpE2Lvxwz1Sj4czfvn4vONU4ulAAGicni/LTjYR4Jxo7g2jzjSAzJQ5Ll3iUCDUqphu3IACF7150MUqPvr4mS2/sCkICEEKic3AUhfkZBlXJjkUF0HW6JTXJTVwOHYOmNZHv80eQlRYHSFLyQgCrdlXOeKUkIRtezklVff5ITH7U4vC4dAjO00sOVzvnASDJ8vJPz5ghPZSz+ZNg9uaq/VNOQkmypjMaifKYvC0kKBn3eaI6Z4DsTZ9/mBTvOHZ0TxnbVV7q1hXlfO6mqi3P1nEhvIFg2NbU2Ol0hcIM2yAgPHcI5pwA8rd95iFEnN5UVqS19piQTMHO8lJFEHIpb+OZ1Mm1DLjT1jVsexyxizQ0hkF/CJSSlitXKmK353kAYc4rUpPilbQlcXjQ5MOv9zvgdjuwesVSw1b4yRgAxut7B4KGxgjIpDdLSpyOx20+Swh5dTqdaQEo2I6VKzKNJ0+HwIWEkBJ1j7rx6ppcnVIcTdt4xjVeawmHyYVE1BYTZ+5xqFCpxMOmHoVSXJgzAICSrPREtHX7JxKdfSaYoiIj2UMczJ7kBVuldExY/Gu83FQXrtc2WlLImtvVe5vmBJC5tdIppUh3OjUEQ1bMM29PAMsyl6gScgMAFB+6WECkuOlxaLBsCQkgM8lAR++wbO0cClpW9PgMi5wawBg1VACghMJ65mqFLRuMMUooSwYAytgxl6EWFOSlcv9oFJpCkehScb22kQsujzyoOTg8Z4DWxFxTEvDASBhOI9bZDk1BYCRsQwovADCCbbvfKsS6wizW548gJU5HQ4tPhsJRJcevTWu+GQFwpYJT0BbfoIl4V+xL0O3Q0NfvtyXFnZLD1SrnMlNRGf78O4BwlCMlXofKxhcisucHAEAKcbW1vdfKSHZP5AgBDI2if9g0OHi9orscACAkgS3Geo5AKIqoJSVltPbuud0t8wagjF3wdvUpTo0izjm2C4yOeYJzAS2smLe/2BdglA72Do0gwaki2aMhErFQ+9ArbFvMaL7nArT+dKKJc1FT/0eztTI7GZQQcCEmrpniUFQAICBnb/7eEtaZBOwofrzxyLI5P3Xv/L662QDM2BFlb69MQFRvXlf8UlIUKmnvCWBtfhpu1TXADEUeS0LfznmltCnU3V0jBN9DKIsQKU7Xn9tbNVMfOGsAAMgpr9qpG9p3b64vUhraBpCe5IQ5PMzbO3xsNBL9yvvzxx8AQNmBb4wbNQfDsxGdHM/tB9rcK66GI1Glpb1HZiS70DUwgrycpWx9aQEIJdvG6+YjPiuAZaY3GwA0hSHBrcOKcjxo9kGAQgqZWVJSPeV3fsEAnl470UIJqbVsLobNsY4nagtwPnbE/tRux6ICAIAQ5Hirt0sKbiPJY8Dj1DDoN0FABpuvVQYWHcB77WQdF/JUw1/Nlko44gyK5raOMICzLyIOzOHPaLjpl1vuvFuir3/otW7fAOO2vLw8FP7I670hXhRizpFdVmn856KLFf8AcP0p5DnhnVEAAAAASUVORK5CYII="};
|
1391
|
+
//--------------------------------------------------------------------------
|
1392
|
+
// activate base64 data URIs
|
1393
|
+
//--------------------------------------------------------------------------
|
1394
|
+
|
1395
|
+
var data_uri_by_embed_uri = {"cid:82357576":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAFVBMVEVmmcwzmcyZzP8AZswAZv////////9E6giVAAAAB3RSTlP///////8AGksDRgAAADhJREFUGFcly0ESAEAEA0Ei6/9P3sEcVB8kmrwFyni0bOeyyDpy9JTLEaOhQq7Ongf5FeMhHS/4AVnsAZubxDVmAAAAAElFTkSuQmCC","cid:82357212":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIkSURBVDiNjZJNSxtRFIbfc+cjmZkkfjSCEFuQtghCwUWj0KXb/IQs3GlBKBQ3waWLoNBfIBSkJYI/ILsupIsuGrIqLQGRoEak6KLNmExzZ+aeLuJMZ4oLz+7e97nPORwuMTMeUvOVvTrAW0TUZua1brN2AgAUCVZeH9aZeUsToh2Eaq21Xz3593h3U9P1vcKjojPyPDV0+z0wL3abtYEAgOWNxmYmY7x5ufTMnCsVV4QQn8rrDSduT7STny46mm7AzheEputTAFYBQIxz2llceOxYVgZP5maEbZkxMF/ZnQVg64YR+8xM1gbwCgBEeb0xC8B27GwMTE7mbKIxAKCsG8YouQ/dNDUiEU9QzjnZFFDIWZqmaauRwDAzuf8EYFYvYsFEwUkB+ZyFMBwDADwAKpmzYoDIiwQeM6eAMFQggnd37ARSDpN54EsQqB0JOreDPynAHXgQQrRjQeBrKYGUklkdA4AOoDMcjlKA63oyCMLju+MpK2XfXF4kERPA10hwKv3A/vzl+71At1mTAFINkkUP+crzld0egFLiyu82a2Y0AZY3DnvMnAJa+1Uz7kJ0npuaLmUsG74coX9zfRVlOgBogs6fPy2VZooT6LtDfPtxdpWQgZkPPLe/JDTdGvb7koGjKBMAEITq4OLyxnNvPZxdXEtmPkK6PgS+/+739c9bX47eg7me2kF5vZElom0Ab4noo1Jqu7Vf/XXPLkS3WUv9mb/vR+THZPMfuQAAAABJRU5ErkJggg==","cid:82356834":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAOdEVYdFRpdGxlAFRlcm1pbmFs1fugkQAAABZ0RVh0QXV0aG9yAEFuZHJlYXMgTmlsc3Nvbivv5KMAAAAYdEVYdENyZWF0aW9uIFRpbWUAMjAwNS0xMC0xNQ2UB1cAAABJdEVYdENvcHlyaWdodABQdWJsaWMgRG9tYWluIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi9Zw/7KAAAJiElEQVRogdWaWYwcxRnHf1Uzu7O7M2aNDSwGH6wXG18kOEgQE8QdIkWKIqQkj0hBUZSHPCUvKBFCSSSsIEVRXhNZIEUiichLYkUJwhgfYBRjDmNhfARjG7M+dnfsuWe6q+rLQ3X39Bx7mASMSxp1d3V11f9f3//7vurqUSLC1Vz0lQbwv5arnkA2ffHCC9tWidZbQd0n4m4SEXW5HYoIzrnoKIi4T3n0/TgRECdKZycRt8cGwc+efnrryXg8FfvAH1/Y9t2BgYHnbt+4efiG68f08PAwcNn4/y9FEBBBxJ+LCLVqldNnTruXd/yr2QiaT2z9xbN/SQg8/+fnbxnU6v2HH/jGiDWWmeIMrVbrioCfrQwODDI6OgoKtj33h3rYrG/cuvW3JzXAAPLM7RvuGLLGMnl28gsHHiAIA6ampxARHnno60Muo5+BxAfUfTdcP6anZ6YBOHfuPK+++grFmUtA/zCrtUYphVIqda5Rio66dDvVp667ndYKReqe1ixalGfd+vUsuXYJpVKJFStWamvcfQkBEXfT0PAwQRAAsGv3To6dPMjZM1NtN0jxkPhCemo6G0v6Mem63f8ZEfyYSReOW8aXo5Riy5Z7CIKAkZE8zWbjphQBUcofAShOX+KTj8+jlCKrM13DxyNEg3WDmwNMD2jp13NnG2uEj06cwdxrqNfrZLNZH52sUwmBfkWcA6X56S9/4CNCHBmiofxA/locoCTVjr7H7j7aP3COjuu4/e9+9ScQQWuNtQZBsNZinWVOAk4EhePiVDkJZSKRlWKwSZiLWQuCi67b92NgyfNRH7HFfd/Sfi4iiviJFAStNGFoyDiHtQZr3dwEYgvkRnR7TmIAKUDxrLdnVQNREotIqTTY9HMpq8XgE7+J6p1zXloarDE40d4Cdg4LKKW8BcQxM1XpSSqkAIuTpF4pOmY1bYV45iVVp1L3upNXLFHrHOIsCk1oQ7TzBFyaQMwmLlprnHMopcgNa1B0AKU9l34giR3apdqoWAXRzU4ZJTLRKbJOCMImraBBK2jQDBo0GtUEkwktSluMMViXkpCLLnoJaIrTlc4ZcuIJdcxapPREw85LIdZxh8QkWev4sS31eplKrUyjVevB4qJ2SiusM2DplVA/C3igjsFhBaL8gBlwJp7JWEptTSfS8UG5ww9i0kq8LGrNGo1GhUarjogjMwSFoVyk4dQqLDK4VhoTxlHIzE8glpD3AS+NpRPLaZUr1ItVXGATEk46LaH6EUSw1lGuXqJULrZnep71YmwBrTXGGsQ5jLHJ8xGB2SU0MKgADUpYvnwF925+lPeOv8nhw29Rnp7GNsIYMuLiiBNlisgyThzVRplqvYTFkr9moD9y1efSRRJSChOGOBGMCZM2noBrW0CipOHEoQSK0+UoRQrNRotlhWXcvPkxvrrpft764A0OvLOPyRMnCathErPbCUuo1spUqqUeK/dDrPpUu2RJIcnMW9Puyzux9XIw1mBC4wlYQSlHNuf1rETRaFWZrEyydOQ6lgws5dEvfYstm+7n4Edvc+Dga5w4ehhTaYG1NJoNqvUy1lmGRrJ0R+xOsHPoSBIGUfSxhD0WsP7Nx4QGY8IOH7g0XY0c0/Hmrjd4d/9brJyYYGJiHevGNzGx7FbuWr2FO8bv5NjkEba/8iL7XtpBUOtckqsFvRupHiqxBQBCY3DOh9EuAhZxQmjCtgXEoUShB4gkpJAwJCwFfPj2QU4cOsTOwt+49sbrWDOxkS1feYCbx1awfv0mDuzZRRZh1qL6nrZrUpXi2gtDa0KM7UfARRIKQ4xJS0goFVN5QEFmKEtmOMvK5asYX7OG1atuY+P4JoZzI1RaZU589CGViw1MPeyLsAfwLJaJbSEdFrBYGxKGXRJy1iHiw1MYpiUEKuPDoRIYv2sd9979MBvGv8zY4jHymTzGGU5fOsX2vX9l756XKZ65QEaEzHCWDknMI6H+ElOpzA/G+Anu4wM2CU+xBbyZhE8+OeeXEeLY9ODdfPPObzOSGaFkShz8+B3+ufvv7N25g/K5S7iGWdAUz+sPaQmlFoHGeB81QZ8wGvtAbIE47GktoBWQQWc0JVPitWO72bH7HxzYt4/mTB0XWjJAJte1NuyQ89xxfxYDtCXkwIR+9vtGIRHXEYVi5rVKkAA5deoUP3/2Jxza/w6tYtMvuWfHNMuNWUXftyROjODE+6pLyaojD3h2JiIQNci2N++O7H+PoNwE8S/f6MxlOGX6ZHYNdd/ut3frXFcii33AGoOJJBSvOhv1trka9XDhTjn37ajR/J3023sW12UB/9LgEn0lFhDQSs2DRiVYVt9zGytuXrkQ6ExNn+fovvdxgaU79rd7TYFNEbEp6bYTWZSJw9B0+ECr2U4acc+z8Vm3diNP/vApBtXgnOCdOLZt/z2HXj2IaZk5Hb2fBfpKKPYBk7YAURLu6DGajD4siheL7Nj/0pzgY5yTk2fweaLfdLSt2g6jKQjdEnLW4aIo5MNoJqGeXvnNV/Zu38Xe7bsW3D6otRAryWT0W5suzAJRHjDWh9HB7EBMn+nJyoIBcTltF1riFxqlEjJpH9CQ8gETEoaGIGixcuWKhMQV/aFYuWpF9B7s/bE3CkXL6TD0PiAifP/xJ8jlhtHa54G5NmTVwtbKn6oopag3akzNnE/qeiTkrBVrjbLWL+aCIKDRqH9moGYrtWqN0Biy2Sy5XI5cLtcBFtp7VkR+rQGcuLMzM9MUCov6Zr7Psjz247tZ9Z0LgH9hWbx4MYVCnsHBAQqFRT3tM5kMtVoNrdRZpZTSSqlsGJg3jh0/5tav2/C5ggd4+9x2WrYGQCFf6NhOKeQLPe1HRkaYKc5Ya+2/gXwGGMoPF45cLM88fs+Wrw2M3XAjpXKJIPh8vtKUDuepHrkWgNzQEPn8Iq4ZHWXJkqWIEiqVst/mz2YpFAo46zj+4fHg6NH//OjCuQtFBYwAix565P7vjS0b+/XDDz4yNLH6VjU6Okr8xdBFSw0nzu/NR18h41Vsu85FdYJzNnnWiUtemmzSl/hj/Iv6ESdJ+3ado1qvUyzOuI/PnA7On7/w1J6dr78IVBQwCBSAwtoNa9esW7vmyezgwGalWMKV+kzZW0SEi2ErePf9D4785sSxE8eBGlBVfldZDQF5vDWGgRwQ7z7NugX/ORWLjzgWCIAm0ADqQC35TqyUytIGPwhk+GIQiME7wJAiISKiusNmlJTinSjNlSfgSBEQkY7E0EPgaitX/Z89/gtKTbM2+RLpBQAAAABJRU5ErkJggg==","cid:82356428":"data:image/png;base64,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","cid:82356008":"data:image/png;base64,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","cid:82355644":"data:image/png;base64,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","cid:81900308":"data:image/png;base64,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","cid:81899636":"data:image/png;base64,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","cid:81899006":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAU3SURBVGiB7VlPaBRXHP5+82aTSLIrkY3YJR68VmuSPXlRPPQPGg05iD14sZfEUkpbPJQqQVJs0yQlkEDobaE9CaloTlI0InhYNOBi2yAFT0JxZW2ysn/cmTczvx4ym+7Ozs7uzK6kQj54zOzvzbz3fe/3583MEjPjbYay3QRaxY6A7caOgO2G2uoAExMTB4QQVy3LGrEsq+XxnFAUpcDMCVVVv71y5Ure2d/yhKqqLgwPDw8PDg6SEMLzWj8lu3ytlLLr9u3bXzx48OAlgJma+f3Rrcb4+HgoGo1+FI/HSUoJKWVDQpXnThsR1fSHQiEcP36849GjR2NtFxCLxYSu64qiKDBNsyXyAGBZVo3NNE2EQiEA2OU2dttj1gkvwn766+GNCvAi50eQF96IgCCrHVRQ2wW0Sq7tHhgfHw/FYrF69bELAAzDgGEYvsipqtoU+cA5MDExcUBV1Z/27t37vld97+rqEtPT056TOCGlRF9fH44dO4b9+/cHTmDAQ4AQ4uqpU6c+jMfj5Itdk0in07h27RrOnz+/ZWurByzLGjl8+DBpmlZVn5tBo/AhIuzbtw+GYSCfz6OnpycQ+UYCVCEEDMNoG/GKscHM6O7ursodv+Q9BfhBOypL0ErUsoBmCDda2WbKLTO75mJgAX43paB7QYWdiIjYsQK+X2gqB3WbqFmbc0wvQfZvBUC3815fHggaLl4hREQgoq1KV36kLh/LhYSZNQCdAKpeapoS0I5wqSciEokgEokgm80CAHbv3g0hxNY1hmHg3r17xvr6+q9u3BoKCLrCzfRJKTE3N2devHhRhMNh5HI5qKqKyclJSCl1+7bSxsbG8srKys8AXgcS4IzddnmEiEpPnjz5anFxcebChQvhPXv2AAA0TeOFhYUjxWJRBWAAKADYcBPQVBK3kqxeNgD86tWr35PJ5Oj8/PxGMpnUmRnRaLR09uzZAQAv7ZYB8I+zAgFtDiG/HiEi7u3tzV+/fn0tm82+p+v6lw8fPvyso6Ojo7+///uDBw8eWltbKwKo+7Ld0AOVIeRczRZXHwAgpRQA1GQy+Xp2dva7W7duHXr+/HnCNM2+EydOfAqAsLnQgohUIqri/EZDyE20Y1wqFoudAEI2SfXOnTvZqampr58+fTrAzO+cPn26z+ap2GIUKtdY1AkhIlIvX75cQ8rt6MfmNlWpVOqyyVU+8vLS0tLfAL5x2AGgasB6OdBJRKZpmnB+MqncdCptdlWpjO8tmxOKokBRFORyOWiaxrYAaZOz7GP53Ko4N5m5avIaAUQkAKi6rv+WSqVG4/G4UvlGJqVEPp+HEAKRSKSOfm9YloVnz56hUCi8XF1dTdvkpIN8pQDLrQK5CijrSCaT05ZldS4vL3/AzAIADQ0NWaOjoyoRIRwO4+7du3JlZUXA4dZGsPPhz8ePH/8AQLPb6zLxemRdibo8mxCAHrt1A+gAwGfOnDly7ty5xZGRkV0AsLq6Km/cuLGWSCQ+yWQymh8B+C8hS9jcpHLMXPPhthnUeICZmYh0bK4KAdABcCwWG+jv71dN08TNmzdLqVTqr6WlpY8zmUzN7uhDgG6LKAYhD7h4YKuDqBObn03EyZMno4ODg38cPXpUSaVShRcvXkwmEolfcrlc/Q+i3ignlQ6gyMxBx6m/EzOzZntCDAwM/AgA9+/fn02n01OJRKIQdEIbyuYUwYmXUdcDZVy6dOldZv7cNM3JmZmZdKsTth3OXdPZxsbGQo2u2c7W0AP/d7z1f/LtCNhu7AjYbrz1Av4F8/cV1apw1zkAAAAASUVORK5CYII=","cid:81898502":"data:image/png;base64,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","cid:81898012":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAJOgAACToB8GSSSgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAS1SURBVFiF7ZddbBRVFMf/596Z3W3rtiwtUFsJFQhWMQSIWi0UKJHPlISvCGpiogkxig8SlBSj0Rij6YMPJhB9IyZqTFRC4pNKAgElplSIsRURRL6xtLRLu53dmbn3Hh9mFrZ1Kcs2pi9McnJndu8953c+7rkzxMwYz0uMq/W7AACssSpofo2qlJQfW6X66QNvs7rT9WOKQNP22Kz4xNqOadX1y1CkM0UDLH7dXlo3ddahV9a9O62m6n6/WD1FUS9qtbbMe6i5bUXDxkR/5h+AijVfBEBTa+TD1Q3PbJlX3xQ/39eFeKyyeOt3AvDIi2THJsivn1u5fUXt5LroxeRJMBjA2BoZFdIJm7fRBHFP+f4tLTvnRksism/oCjQrKOOjIlaFgWTSOX3pj0FmRiAGBszMBgyG1gqdZ38+cvh9tWGk7ttG4IltJXWTJtbsf37NjulplaSeVDeYDTRrGKMw6PahrKK89OH43FJjVAimYFhBax/aKFRXTEfn3+2T8+kfFaDpjUhD3X0z9m5e9lJNz9A5eCoDRughGxhoeF4ag+41aKOgtA9tfCgzfCwvmXRLG7cEWNRqbZ5d9+iulY2bKi8ku6CMAhGBmQFigAIAIzTYaLBQYFYwRsGwzhGD0eokL0DTzug7jXNWvjq/fkHFqd6jAANEwV4jQQEAgvwaykIoMGmwMGCjoTkACUZTOMDCndaelsZnn5oyubr0VE87iAQIBCKCEHRjyxOFBcY+UqofQ24SaX8IMACMALGEhRKAGYZ14QAEOL3XL2urzCDpdKMsloCAgLAEBBG0ceF4STg6ibRKwtVDYV0w2ABGM4xmaMUwiiE4ghnevFB1AQCHP1BbF7dG/pw+MPutWTNnVnZc/A5CANFoDBAaWmQgJUFIAkmCsAPdzATWDKIcUwwo30VGOQCDiEgyDw9H3rPgUJu/u/PEby8cO97R3TB1DWw7AtcMQlEGQhKERRA2QVqhhPfCDv4bBigDGmYIABEikqMCEJEAYHXs0ge62i+tPXjk+/Pz713FidIpECJQPsywLSAtcQNCWrnGEdTNzeBbACyim7/k2wUiFHlir//X4LneFtfd9+Xy5pYHrnKX7PXOQsjQS4tQYpcjEa0J8m+CvGvF0L4JR0ZpJA4wKEc3Idybt+uEdPEX9F0/l1rvet988uSS1Y+XJxKxC86vAYQlUFlWC75alT5/+kImaMPgoMOb4KQwxNdwlJlNb14DI8+CMEeRUOyc0X5sq/3mwgWN62vrE/HTqUOQNqEmXo8zR5z+z3Yc35BJwgGgAPiheCPus88uh4b/UwNhlepQ0TBp3+2/d/CHn9p+bz/TP2fialgyEuRYgEnCAZAB4OYYG6lDA/A4x+tbpWDkG07Q+gB9bI/63OvvOjXgDHy0fMWq6hRdBsNhIZEOAfI5kI1Chnl4W8wLEBJ6RGSyhsO5EoDs3Kd/TCUvrXOcb7/YuHZTHXE3ywgcAOlwfnbNDa9Hen67CGRBFAAV1oWdBQAgzh70T7rXe5pd79OvonbJg5E4hsII5AJ4AHQ+wwUB5IBkw4pwDwsAdOU4UiQGl8xc6r3cK3AtnMPBksK++Qp6I/o/r3H/MroL8C8JiYMXQa6AIwAAAABJRU5ErkJggg==","cid:81897676":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAJOgAACToB8GSSSgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAASrSURBVFiF7ZdtaFZlGMd/133O2dgcmunUZDgzzIYvJIH2wU2UtDKKXkCCLIqiDyIWZfhCEYIRCUIgUvYhApMKKoUMDd9ymagzNHTGZNlSp5tz0z17e55zzn1ffXjOo8/WZuqH+SEfuLgOPPc5/9/1v677PhxRVW7nz9xW9TsAtwowZ7X4Ve/4i24bAFcoKb173MZH3h2yY8FSKRx8AGDqhBnpt57/eJ43aszhqqVSOugATh1i1Cx+ZvW0svEVNbNWFE4eVABVR1d4mfOpehY9+kb5tAkz9lSu8J8cNACnjshGpOMOTrcdY/7Dz42a/eBTmyqXFy6/medIfydh1Ur/64pxM+cGnq8igogICCJylXtieUXJsGF3FbV2NeLUouoYM3QCF1uaurfu//zb6oLoFX1f3S0BVK4q2PPmwg/mXOo6h4jBE58siMHINdNS6VbSUReKw6nDOcvw4tH4tij6ZvdnB21rasHeDdp5PQB/oD+6wxSN7acScYMRL8kCJE4IqCqqDtUsRHNHA8XB0OCFx5bM2rL3iyOz35Z5+9bp2YF0BpwBq5bYhkQuQ+ySbDPZTAYrIY4MTrLXlpBYM8Q25HJPMw1Xjsqzc1+aVFY26UDlqoKZNw3gXEzswiyEzYrHZHAS4gixksFKhJMIJyFWQjKuk/boIq1djbR0nuXYhd3Mnvl42eTxD22rXO6/2J/OgC2wGhO5ECMeBoPxPXwEMMk8CKHtpjPTRmfUTjrsxFqLs4qLFRtnZ6vxSh3Tx88fOaxk2PqqlYUV1R9mVt0QQCbupivTjmd8giDAOEirRV1M5Hrose3EGmYXK4gPngi5jaKAi5XQprmQqqe0ZGKh58mUG3NAkY50G80dfyEGvMDg+YLnC8YXjCcYD7zcjlAQp7icuCbhlIpRs4hSfuqnmu+/PLDWLmFNb6l/zYCIeFwdczBGMIasaALh+YIXGPxA8APBC6Q3oC/4vseM8idoOdfe9uuhXe8dWGuXAd51HcgeOHiqWQAREC9X8bXwEhfEZDnVKbndqQoFUszU0fM4WHOo6dSxhsW/b3bViZaKiNW8w6dvCwzgoUhRUELZ8PsxgcH3kyoDk3UhAUnFTaRtJ+queVbij2BicZXu3PPT37W7Wl9u+MXWX30u2CTHAwEkPXSttX8cvySmGBHIgKiIGAMogiDjxo8tHDHSL2rqqcM5AXWMKCyn1E2Jf9ixpfbIVx2vtZ+mLUHLtVT6avU6ikXEAAVAkOT86yA/Xv10+rb7ZhWPaOqpw8WOewqn4pqH9+zYuX1/zcbMsrCLHiACwj45rXrtHdHLAVV1ImITy2xiVX4FCjjAiqDGCL5vuHdIJQ3H21LVP/+4ueaTaH1yX5REnIQFonzxflugqlEyjPmiOeE4uccgqMHngSHzObzvRMtv1bVrjm6KtueJ5SByOa2qcV+9AWZAQxFxuWqT8MkOkAGMgI71prN123fnTlY3vn5yqz3RZ30OIgYyqmr70+r3ddxrQfZcCK5WnsTTH5X9GUXp83W7Ly2s30tznks5iIh+LL8hB/q4YQGb1xYDyKXLFzec2R+uO7Ofnj7i+l+ivQq88234vwf4B6YlTDQudkyaAAAAAElFTkSuQmCC","cid:81897116":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABSlJREFUWIXdl1lsVUUYx/8zc7a7daUroXQhlkpoQ4sVA8b6gilbIEIDggEiEiSRFwzEJ/pCXXjgQR8sAW0I0QQSicZIiC9IsClFFqlC6HorXW/Xe+/p7b3nnpnxobbpJW1pS+uD3+N3vpn/b2b+c853gP9rrNp1WZtNHVlo4ZLDl/YzkC+lhAMUZ+9Uv3MCIHK6eraQ4sXvX9ri0tVvD2wtMt4oyaZPvP1rE1bf93ff/f72dGMWbAcKj1xMNYTSeGh7cbxUFNhcQpE2Lvxwz1Sj4czfvn4vONU4ulAAGicni/LTjYR4Jxo7g2jzjSAzJQ5Ll3iUCDUqphu3IACF7150MUqPvr4mS2/sCkICEEKic3AUhfkZBlXJjkUF0HW6JTXJTVwOHYOmNZHv80eQlRYHSFLyQgCrdlXOeKUkIRtezklVff5ITH7U4vC4dAjO00sOVzvnASDJ8vJPz5ghPZSz+ZNg9uaq/VNOQkmypjMaifKYvC0kKBn3eaI6Z4DsTZ9/mBTvOHZ0TxnbVV7q1hXlfO6mqi3P1nEhvIFg2NbU2Ol0hcIM2yAgPHcI5pwA8rd95iFEnN5UVqS19piQTMHO8lJFEHIpb+OZ1Mm1DLjT1jVsexyxizQ0hkF/CJSSlitXKmK353kAYc4rUpPilbQlcXjQ5MOv9zvgdjuwesVSw1b4yRgAxut7B4KGxgjIpDdLSpyOx20+Swh5dTqdaQEo2I6VKzKNJ0+HwIWEkBJ1j7rx6ppcnVIcTdt4xjVeawmHyYVE1BYTZ+5xqFCpxMOmHoVSXJgzAICSrPREtHX7JxKdfSaYoiIj2UMczJ7kBVuldExY/Gu83FQXrtc2WlLImtvVe5vmBJC5tdIppUh3OjUEQ1bMM29PAMsyl6gScgMAFB+6WECkuOlxaLBsCQkgM8lAR++wbO0cClpW9PgMi5wawBg1VACghMJ65mqFLRuMMUooSwYAytgxl6EWFOSlcv9oFJpCkehScb22kQsujzyoOTg8Z4DWxFxTEvDASBhOI9bZDk1BYCRsQwovADCCbbvfKsS6wizW548gJU5HQ4tPhsJRJcevTWu+GQFwpYJT0BbfoIl4V+xL0O3Q0NfvtyXFnZLD1SrnMlNRGf78O4BwlCMlXofKxhcisucHAEAKcbW1vdfKSHZP5AgBDI2if9g0OHi9orscACAkgS3Geo5AKIqoJSVltPbuud0t8wagjF3wdvUpTo0izjm2C4yOeYJzAS2smLe/2BdglA72Do0gwaki2aMhErFQ+9ArbFvMaL7nArT+dKKJc1FT/0eztTI7GZQQcCEmrpniUFQAICBnb/7eEtaZBOwofrzxyLI5P3Xv/L662QDM2BFlb69MQFRvXlf8UlIUKmnvCWBtfhpu1TXADEUeS0LfznmltCnU3V0jBN9DKIsQKU7Xn9tbNVMfOGsAAMgpr9qpG9p3b64vUhraBpCe5IQ5PMzbO3xsNBL9yvvzxx8AQNmBb4wbNQfDsxGdHM/tB9rcK66GI1Glpb1HZiS70DUwgrycpWx9aQEIJdvG6+YjPiuAZaY3GwA0hSHBrcOKcjxo9kGAQgqZWVJSPeV3fsEAnl470UIJqbVsLobNsY4nagtwPnbE/tRux6ICAIAQ5Hirt0sKbiPJY8Dj1DDoN0FABpuvVQYWHcB77WQdF/JUw1/Nlko44gyK5raOMICzLyIOzOHPaLjpl1vuvFuir3/otW7fAOO2vLw8FP7I670hXhRizpFdVmn856KLFf8AcP0p5DnhnVEAAAAASUVORK5CYII=","cid:81896640":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAADAFBMVEUBAAAIBgMMCQQLCwsSDgYXEgkaFQoUFBQcHBwlHQ4rIhEwJhM2KxU7Lxc9MBgjIyMoKCg0MzI7OztBNBpOPh5OSz9TQiFeSyVkUChqVCpuWCx1Rzl0XC5+ZDFOTk5ST0tWUk1VVVVcXFxqXUplZWVra2twcHB7e3sAWpwIX58JYJ8OY6ERZaIVaKQaa6Yebaghb6klcqopdawxea82fbE4frI+grRFhrZMi7pVkb1alL9dlsBkm8NoncRtocZ0pcl8qsyWBAOZAACcCASIIBmdNiegDge3PB6mPiqBZzODaDSKbjaOcTiUdjuXeDyaez26QiG/TCaAeWihclPATifBUCjIXy/QbzfWej3Yfj+KgWWjgkGui0WxjUa0gVi3kkm6lEq+mEyjkmuzn2e7pnLFnU7eikXOpFHRp1PVqlXarlfesVjjlUrmm03poFDtqVTitFrmuFzqu13ywWD7xWL+y2WDg4OXl5eYmJippZ61rZisrKy0tLS/v7+Crs6FsNCLtNKQt9SWu9aYvNebvtifwdqjw9uox92ryd6yzeG20OPCwsLMzMzU1NTA1ufG2ujN3+zT4+7d6fL/7Mbn5+fs7Ozl7vXp8fbu9Pj09PTy9/r1+Pv+/v7MzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn4rtgAAAAnnRSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AD6H4/gAAAABYktHRP+lB/LFAAAACXBIWXMAAABIAAAASABGyWs+AAADSUlEQVRIx+2WaU8TURSGzyCLQEUxiFYtCEo8Da3sYglQbDUaluISV6pYFdsyop1Or8ElSgg2RSjgArSZ63/13JkOXRBZgn7yTXpmyzwz857lFhb3XW9/CsEi317f2c71/OnZ/+C9gSdDKmNySI2GorQNxiaDpFA4FgrS+WgoxFhwck/gMTjBwmCJ+WCYMQso5SBUoQCcZKwGgClg2QSOt7jp7pnWGQFJ2e0tpFYX5+k3TUn+QTOsqAV/hRRmJngiYAVrYILAkipT+C34GzqJ+AW7BDiBhga4VgdwIFmdNMBKMcAQI3Ctz1cOCmPD4hEKVBX5TpdYfg/m7bhC0YHrFHvQtbY2h840fw9Hzh8tO7CaSZ6V3k2AdWXBNdaKosGtwG78SLED4xSd+I1rbWK37ii5cO58pirCUglYBXhIjVlywWGQoluBl7CT83VE8nUZ28lu3ZUycUlLZ8CVUrgGnpgeR7JgZrUxHVzh9/tjAuzxbFRFM7nwGbGZ8wF083UHLlPqDuZWxSAZrBSXqmbyGBuBEQNM0sFCUQJf8QiyAXbRp7uwA5fI7iXei9ifotzlgiMy3R+NqKpMRiv6gUwVzfTAlAiLyUJkxVWPUAYcR5fWfCGB7jV00GOciJ0an95T5133GDLAKXTMY1/K3j6HPeJ42YEJvrAX8M0M1+y8LvJhnnejURmc92HvH2aFGtuWa4I/Ido1qgbElH48j235YNkiwbhxc6QKpJN56NiN18bOnQ2uCV5BvCRaEC8aqAS2rBp76bSRPFutCT4No8chkMu95vG+ynIve3KHUAvO6i04w2d7dCu6Fwxy00LGCpsJrixlQbAVfL/35Qb3VN5068M1vQW/UrG5U3EHxrXGH4IrJTfAxluqUMWicCjLva/zvC8Mf72388fmfIeIS61UIU60o2jFxbKGxsMwzQvfuKScyTREcxz2ZOV9XDCPtY/6ZoB+X/udzl6Rw2RDWfV7ngceonFxXIqMgj83eXey3Fe7HfRh0bAlondZQJKgXM2rsrsmd2rXK4j6ZHx8PMAmhM/y2CO1oH7vmdx9X0wfZLj7v0q/8Orcv7D8T039s/8VH7bVu2c718NbJrhuBzq2leo3nTlTX62DfwGZkKiGotSUXQAAAABJRU5ErkJggg==","cid:81896052":"data:image/gif;base64,R0lGODlhWAAfAMYAAP///3OUxwxHnTZkrlR8ut/m8u7u7kxMTK6urp2dnb6+vrHD4KG32ZKr0ywsLAAAAH19fRwcHO7y+CFVpsHP5o2NjQwMDBdNomSIwQtEnY6n0s7Ozl1dXdDb7CZZqIOfzUVwtDw8PGx6kW1tbczMzP/MZmOlxgBmmRh7rUqUvefv90pKSr29xpmZmbXW54S11jMzM4SEhCMcDg8MBlqcvWZmZu+/X4ltNjwwGG1XK9+yWa+MRkw8HsCZTM+lUltIJCwjEQwJBJx8PjGMtTk5ORwWC8OcTuu8XpkAAGYzAPTDYZUAAMyZM7mUSuG0Wt6xWHtzZiggEABmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmQBmmSH+ClZhbGlkIENTUyEAIfkEAQAAfwAsAAAAAFgAHwAAB/6AJIKDhIWGh4iJiouMhX+PjyQAk5SVlpeYmSWbnJ2en6ChoEdGK5CRmamqqaKtrq8lpKankqu2trC5urGlp3+1t8GYu8Stsr7AwsqTxc2fx7TL0gDO1ZvQkLUBAgOUBAIElQUC5OXkkwYHBwgACQqU1tXYqAAL5AWTDOeUDebl3QYcPBgIIQIEePGazftFiRyDSRLILfAmYAIFCtsEUABQ4YGFAxEGJkCYkNhCYN/CTbogAEPDDBoASGCp0oGFDZM4RKhUsthJSvouTOpAzsMkewIkAPhwb9KDCpQMvCNp4waOqzl0cNrB4yqPHpx8/PC6Q9cxJNkojRMwkSm5Dv4AMHADsPYDpQcGWJWwAWRg3wdBtPYYGATHQLA6ggA2/EBILlJJkEimN2mAgAAALLNsAMCDAM7fBHjYCMCBqk03APvYa/hHidRBylp1nPrBjRI7cDiGdeSG5N8MKTH1EPEyN6IC4IIwtzHE6RI8HuQAtWMg4R82SviwPpDHali+f/9OhpzpgLqiK1FgCYLj8x/SOfW44djHjRw4inQvoePG2L9AwCKEeMAlAwBLLNllGTkuVSJXUjjpJQRg9fU1nWHTQfcADq89wMMmOQD2yoAEohUcJQ8mB0BGbFmij0arcAIfd0BkVx13D5Tlg2LcZfjabp2QSGBalSAlFADICf5wyYsiXCIVSbjh9wOQ2lmFww1gbdJfVzmUtQmJQijBiZDiRVNJcQ0eCM6KHuATFzkJjFQJByNA2ROZSIiJJxJLIHPJNxNNItdDyw1AgVvtRQAVAOk8cBAzPW3CRIlI7InELERW0o9S+QiATwEsmQMXAg9EEMJAptlZkqUlNoEpZWqpBFE3R4XmQaAAIBDSAxzkpeqqlIrnRC9mWuKmWpZIAFcwkXoyabBK/DSNMs06S6mY0k7LbLWdPPubmLy8eqK2uHDbyRPfcpItuTGae+4N4F5DbKbsPueuKD+xoO++/Pbr77//GiHwwAQXbPDBCB8cAxTikrDCwxBHLPHEFA1XbPHFGGf8MBFR+BIIACH5BAEKAH8ALAEAAQAkABwAAAf+gACCg4SFhoeIiYqLjI2Oj5CRkpOUiAECA4MEAgSEBQKgoaCCBgcHCAAJCoULoAWCDKODDaKhmQYOD7oQERCGoAyCEqALmgITFBSXAhQAFQ8WBxG6CYabnYIXAhiDAhkaABLa2A4WG4IcEYexF4IdoB6CrQISAB+ugg8Vgwarhp8Cit0D1QEABkwAAH4Y9MBAowECAgCAqK0BAA8CLG4S4KEZAAeO7nkYFhHTOwEFQYhqFsLRyXsDFHIkREEbCGePtGlbCBEUN0IH6Z1zFBQlgGUBC8ViBmleOwAnBRhaKsJQP0QkfwIYd9TDK4OgElQjxGFEok3FBB0MpnIAhYE8NyPsA1DqgS9EtOrBEvCqgDZRBRE8iBBCF8hEBbAJyyRvo4e0ABBMe8DBoaKvgzALK1ips+fPoEOLDh0IADs="};
|
1095
1396
|
|
1096
1397
|
$('img[src]').each(function() {
|
1097
1398
|
var image = $(this);
|
1098
|
-
var
|
1399
|
+
var embed_uri = image.attr('src');
|
1099
1400
|
|
1100
|
-
if (
|
1101
|
-
image.attr('src',
|
1401
|
+
if (data_uri_by_embed_uri.hasOwnProperty(embed_uri)) {
|
1402
|
+
image.attr('src', data_uri_by_embed_uri[embed_uri]);
|
1102
1403
|
}
|
1103
1404
|
});
|
1104
1405
|
|
@@ -1108,23 +1409,74 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1108
1409
|
|
1109
1410
|
if (css) {
|
1110
1411
|
for (var embed_uri in data_uri_by_embed_uri) {
|
1111
|
-
|
1112
|
-
|
1412
|
+
if (data_uri_by_embed_uri.hasOwnProperty(embed_uri)) {
|
1413
|
+
var src = new RegExp('\\burl\\(' + embed_uri + '\\)', 'g');
|
1414
|
+
var dst = 'url("' + data_uri_by_embed_uri[embed_uri] + '")';
|
1113
1415
|
|
1114
|
-
|
1416
|
+
css = css.replace(src, dst);
|
1417
|
+
}
|
1115
1418
|
}
|
1116
1419
|
|
1117
1420
|
style.text(css);
|
1118
1421
|
}
|
1119
1422
|
});
|
1120
1423
|
|
1121
|
-
|
1122
|
-
//
|
1123
|
-
|
1124
|
-
|
1424
|
+
//--------------------------------------------------------------------------
|
1425
|
+
// create jQuery UI tabs
|
1426
|
+
//--------------------------------------------------------------------------
|
1427
|
+
|
1428
|
+
$('.tabs').tabs();
|
1429
|
+
|
1430
|
+
// make internal hyperlinks reveal their targets (which may be
|
1431
|
+
// nested within many levels of jQuery UI tabs) when clicked
|
1432
|
+
$('a[href^=#]').click(function() {
|
1433
|
+
var link = $(this);
|
1434
|
+
var hash = link.attr('href');
|
1435
|
+
|
1436
|
+
if (link.parent('li').parent('.ui-tabs-nav').length) {
|
1437
|
+
// tab clicks should not cause the screen to scroll
|
1438
|
+
set_hash(hash, true);
|
1439
|
+
}
|
1440
|
+
else {
|
1441
|
+
reveal(hash);
|
1442
|
+
}
|
1443
|
+
|
1444
|
+
return false;
|
1445
|
+
});
|
1446
|
+
|
1447
|
+
// make external hyperlinks open in a separate window
|
1448
|
+
$('a[href]').not('[href^=#]').attr('target', '_blank');
|
1449
|
+
|
1450
|
+
//--------------------------------------------------------------------------
|
1451
|
+
// style jQuery UI icons
|
1452
|
+
//--------------------------------------------------------------------------
|
1453
|
+
|
1454
|
+
$('.ui-icon').parent().hover(
|
1455
|
+
function() { $(this).addClass('ui-state-hover'); },
|
1456
|
+
function() { $(this).removeClass('ui-state-hover'); }
|
1457
|
+
);
|
1458
|
+
|
1459
|
+
//--------------------------------------------------------------------------
|
1460
|
+
// unveil the document
|
1461
|
+
//--------------------------------------------------------------------------
|
1462
|
+
|
1463
|
+
$('#_loading').append("Ready!").
|
1125
1464
|
fadeOut('slow', function() {
|
1126
|
-
$(
|
1127
|
-
|
1465
|
+
$(this).remove();
|
1466
|
+
|
1467
|
+
$('#_body').show();
|
1468
|
+
|
1469
|
+
// respond to changes in window location
|
1470
|
+
(function on_hash_change() {
|
1471
|
+
var current_hash = window.location.hash;
|
1472
|
+
|
1473
|
+
if (current_hash && current_hash !== $last_hash) {
|
1474
|
+
$last_hash = current_hash;
|
1475
|
+
reveal(current_hash);
|
1476
|
+
}
|
1477
|
+
|
1478
|
+
setTimeout(on_hash_change, 300);
|
1479
|
+
})();
|
1128
1480
|
});
|
1129
1481
|
});
|
1130
1482
|
|
@@ -1132,20 +1484,17 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1132
1484
|
</script>
|
1133
1485
|
</head>
|
1134
1486
|
<body>
|
1487
|
+
<div id="_loading"></div>
|
1135
1488
|
|
1136
|
-
<div id="
|
1137
|
-
Loading... <noscript><ins>Failed!</ins> <p>Please enable JavaScript in your Web browser.</p> <div style="display: none"><br/><hr/><br/></div></noscript>
|
1138
|
-
</div>
|
1139
|
-
|
1140
|
-
<div id="__body__">
|
1489
|
+
<div id="_body">
|
1141
1490
|
|
1142
1491
|
|
1143
|
-
<div id="
|
1492
|
+
<div id="_header">
|
1144
1493
|
|
1145
1494
|
|
1146
1495
|
|
1147
1496
|
<div class="title_and_subtitle">
|
1148
|
-
<h1 class="title">Dfect
|
1497
|
+
<h1 class="title">Dfect</h1>
|
1149
1498
|
|
1150
1499
|
<h2 class="subtitle">Assertion testing library for Ruby</h2>
|
1151
1500
|
</div>
|
@@ -1153,7 +1502,7 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1153
1502
|
<div class="authors_and_date">
|
1154
1503
|
<h3 class="authors"><a href="mailto:sunaku@gmail.com">Suraj N. Kurapati</a></h3>
|
1155
1504
|
|
1156
|
-
<h3 class="date">
|
1505
|
+
<h3 class="date">21 March 2010</h3>
|
1157
1506
|
</div>
|
1158
1507
|
|
1159
1508
|
|
@@ -1164,27 +1513,27 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1164
1513
|
<div class="tabs">
|
1165
1514
|
<ul>
|
1166
1515
|
|
1167
|
-
<li><a href="#
|
1516
|
+
<li><a href="#_document">Document</a></li>
|
1168
1517
|
|
1169
|
-
<li><a href="#
|
1518
|
+
<li><a href="#_contents">Contents</a></li>
|
1170
1519
|
|
1171
1520
|
|
1172
|
-
<li><a href="#
|
1521
|
+
<li><a href="#_about">About</a></li>
|
1173
1522
|
</ul>
|
1174
1523
|
|
1175
1524
|
|
1176
1525
|
|
1177
|
-
<div id="
|
1526
|
+
<div id="_contents">
|
1178
1527
|
<h1 class="title">Contents</h1>
|
1179
|
-
<ul><li>1 <a id="
|
1528
|
+
<ul><li>1 <a id="_contents-Welcome" href="#Welcome">Welcome</a><ul><li>1.1 <a id="_contents-Features" href="#Features">Features</a></li><li>1.2 <a id="_contents-Etymology" href="#Etymology">Etymology</a></li><li>1.3 <a id="_contents-License" href="#License">License</a></li><li>1.4 <a id="_contents-Credits" href="#Credits">Credits</a></li><li>1.5 <a id="_contents-Related-works" href="#Related-works">Related works</a></li></ul></li><li>2 <a id="_contents-Setup" href="#Setup">Setup</a><ul><li>2.1 <a id="_contents-Prerequisites" href="#Prerequisites">Prerequisites</a></li><li>2.2 <a id="_contents-Installing" href="#Installing">Installing</a></li><li>2.3 <a id="_contents-Upgrading" href="#Upgrading">Upgrading</a></li><li>2.4 <a id="_contents-Uninstalling" href="#Uninstalling">Uninstalling</a></li></ul></li><li>3 <a id="_contents-Usage" href="#Usage">Usage</a><ul><li>3.1 <a id="_contents-Assertions" href="#Assertions">Assertions</a><ul><li>3.1.1 <a id="_contents-Negation" href="#Negation">Negation</a></li><li>3.1.2 <a id="_contents-Sampling" href="#Sampling">Sampling</a></li><li>3.1.3 <a id="_contents-Failures" href="#Failures">Failures</a></li><li>3.1.4 <a id="_contents-Emulation" href="#Emulation">Emulation</a></li></ul></li><li>3.2 <a id="_contents-Tests" href="#Tests">Tests</a><ul><li>3.2.1 <a id="_contents-Execution" href="#Execution">Execution</a><ul><li>3.2.1.1 <a id="_contents-Hooks" href="#Hooks">Hooks</a></li><li>3.2.1.2 <a id="_contents-Logging" href="#Logging">Logging</a></li></ul></li><li>3.2.2 <a id="_contents-Sharing" href="#Sharing">Sharing</a></li><li>3.2.3 <a id="_contents-Insulation" href="#Insulation">Insulation</a></li></ul></li></ul></li><li>4 <a id="_contents-History" href="#History">History</a><ul><li>4.1 <a id="_contents-Version-2-0-0-2010-03-21" href="#Version-2-0-0-2010-03-21">Version 2.0.0 (2010-03-21)</a></li><li>4.2 <a id="_contents-Version-1-1-0-2009-10-27" href="#Version-1-1-0-2009-10-27">Version 1.1.0 (2009-10-27)</a></li><li>4.3 <a id="_contents-Version-1-0-1-2009-10-07" href="#Version-1-0-1-2009-10-07">Version 1.0.1 (2009-10-07)</a></li><li>4.4 <a id="_contents-Version-1-0-0-2009-05-03" href="#Version-1-0-0-2009-05-03">Version 1.0.0 (2009-05-03)</a></li><li>4.5 <a id="_contents-Version-0-1-0-2009-04-28" href="#Version-0-1-0-2009-04-28">Version 0.1.0 (2009-04-28)</a></li><li>4.6 <a id="_contents-Version-0-0-0-2009-04-13" href="#Version-0-0-0-2009-04-13">Version 0.0.0 (2009-04-13)</a></li></ul></li></ul>
|
1180
1529
|
|
1181
|
-
<div id="
|
1530
|
+
<div id="_floats"><div id="__command__"><h2 class="title">Commands</h2> <ol><li><a id="_contents-gem-install-dfect" href="#gem-install-dfect"><tt>gem install dfect</tt></a></li><li><a id="_contents-gem-update-dfect" href="#gem-update-dfect"><tt>gem update dfect</tt></a></li><li><a id="_contents-gem-uninstall-dfect" href="#gem-uninstall-dfect"><tt>gem uninstall dfect</tt></a></li></ol></div><div id="__example__"><h2 class="title">Examples</h2> <ol><li><a id="_contents-Logging-information-in-the-execution-report" href="#Logging-information-in-the-execution-report">Logging information in the execution report</a></li><li><a id="_contents-Sharing-code-between-tests" href="#Sharing-code-between-tests">Sharing code between tests</a></li><li><a id="_contents-Insulated-and-uninsulated-tests" href="#Insulated-and-uninsulated-tests">Insulated and uninsulated tests</a></li></ol></div></div>
|
1182
1531
|
</div>
|
1183
1532
|
|
1184
|
-
<div id="
|
1533
|
+
<div id="_document" class="tabs">
|
1185
1534
|
<h1 style="display: none">Document</h1>
|
1186
1535
|
<ul>
|
1187
|
-
<li><a href="#
|
1536
|
+
<li><a href="#Welcome">Welcome</a></li>
|
1188
1537
|
<li><a href="#Setup">Setup</a></li>
|
1189
1538
|
<li><a href="#Usage">Usage</a></li>
|
1190
1539
|
<li><a href="#History">History</a></li>
|
@@ -1192,85 +1541,84 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1192
1541
|
|
1193
1542
|
|
1194
1543
|
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
<div class="chapter" id="Introduction">
|
1201
|
-
<a name="Introduction"/><div class="nav"><a title="Focus this segment" href="#Introduction"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus next segment" href="#Features"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Introduction"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1544
|
+
<div class="part" id="Welcome">
|
1545
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Welcome"/><div class="nav"><a title="Here" href="#Welcome"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Next" href="#Features"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Welcome"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1202
1546
|
<h1 class="title">
|
1203
|
-
|
1547
|
+
Part 1
|
1204
1548
|
<br/>
|
1205
|
-
<big>
|
1549
|
+
<big>Welcome</big>
|
1206
1550
|
</h1>
|
1207
1551
|
<div class="content"><p>Dfect is an assertion testing library for Ruby that emphasizes a simple assertion vocabulary, instant debuggability of failures, and flexibility in composing tests.</p>
|
1208
1552
|
|
1209
|
-
<ul>
|
1210
|
-
<li><a class="xref" href="#History" title="Chapter 4. "History"">What’s new?</a> — history of project releases.</li>
|
1211
|
-
|
1212
|
-
<li><a href='http://github.com/sunaku/dfect'>Source code</a> — obtain via <a href='http://git-scm.com'>Git</a> or browse online.</li>
|
1213
|
-
|
1214
|
-
<li><a href='./api/index.html'>API reference</a> — documentation for source code.</li>
|
1215
|
-
|
1216
|
-
<li><a href='http://snk.tuxfamily.org/lib/dfect/'>Project home</a> — the Dfect project home page.</li>
|
1217
|
-
</ul>
|
1218
|
-
|
1219
|
-
<p>To get help or provide feedback, simply <a class="xref" href="#License" title="Section 1.4. "License"">contact the author(s)</a>.</p>
|
1220
|
-
|
1221
|
-
<div class="tabs"><ul><li><a href="#Features">Features</a></li><li><a href="#Motivation">Motivation</a></li><li><a href="#Etymology">Etymology</a></li><li><a href="#License">License</a></li><li><a href="#Credits">Credits</a></li><li><a href="#Related-works">Related works</a></li></ul>
|
1222
|
-
<div class="section" id="Features">
|
1223
|
-
<a name="Features"/><div class="nav"><a title="Focus this segment" href="#Features"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Introduction"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Motivation"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Features"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1224
|
-
<h1 class="title">
|
1225
|
-
1.1 Features
|
1226
|
-
</h1>
|
1227
|
-
<div class="content"><p>Dfect is exciting because:</p>
|
1228
1553
|
|
1229
|
-
<
|
1230
|
-
<
|
1554
|
+
<div class="paragraph" id="Resources">
|
1555
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Resources"/><div class="nav"><a title="Here" href="#Resources"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
1556
|
+
<p class="title">Resources</p>
|
1557
|
+
<div class="content"><ul>
|
1558
|
+
<li>
|
1559
|
+
<p><a class="xref" href="#History" title="Part 4. "History"">What’s new?</a> — release notes and project history.</p>
|
1560
|
+
</li>
|
1231
1561
|
|
1232
|
-
<li>
|
1562
|
+
<li>
|
1563
|
+
<p><a href='http://github.com/sunaku/dfect/issues'>Issue tracker</a> — report bugs, request features, or ask for help.</p>
|
1564
|
+
</li>
|
1233
1565
|
|
1234
|
-
<li>
|
1566
|
+
<li>
|
1567
|
+
<p><a href='http://github.com/sunaku/dfect'>Source code</a> — browse online or obtain using <a href='http://git-scm.com'>Git</a></p>
|
1568
|
+
</li>
|
1235
1569
|
|
1236
|
-
<li>
|
1570
|
+
<li>
|
1571
|
+
<p><a href='api/index.html'>API reference</a> — documentation for source code.</p>
|
1572
|
+
</li>
|
1237
1573
|
|
1238
|
-
<li>
|
1574
|
+
<li>
|
1575
|
+
<p><a href='http://snk.tuxfamily.org/lib/dfect/'>Project home</a> — the official project home page.</p>
|
1576
|
+
</li>
|
1239
1577
|
</ul></div>
|
1240
1578
|
</div>
|
1241
1579
|
|
1242
1580
|
|
1243
|
-
|
1244
|
-
<div class="section" id="
|
1245
|
-
<a name="
|
1581
|
+
<div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Features"><span class="section_number">1.1 </span>Features</a></li><li><a href="#Etymology"><span class="section_number">1.2 </span>Etymology</a></li><li><a href="#License"><span class="section_number">1.3 </span>License</a></li><li><a href="#Credits"><span class="section_number">1.4 </span>Credits</a></li><li><a href="#Related-works"><span class="section_number">1.5 </span>Related works</a></li></ul>
|
1582
|
+
<div class="section" id="Features">
|
1583
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Features"/><div class="nav"><a title="Here" href="#Features"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Welcome"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Etymology"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Features"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1246
1584
|
<h1 class="title">
|
1247
|
-
1.
|
1585
|
+
<span class="section_number">1.1 </span>Features
|
1248
1586
|
</h1>
|
1249
|
-
<div class="content"><p>
|
1250
|
-
|
1251
|
-
<p>Other testing libraries do not fulfill this need. Instead, they simply report each failed assertion along with a stack trace (if I am lucky) and abruptly terminate my program.</p>
|
1587
|
+
<div class="content"><p>Dfect is exciting because:</p>
|
1252
1588
|
|
1253
|
-
<
|
1589
|
+
<ul>
|
1590
|
+
<li>
|
1591
|
+
<p>There are only 5 methods to remember: D F E C T.</p>
|
1592
|
+
</li>
|
1254
1593
|
|
1255
|
-
<
|
1594
|
+
<li>
|
1595
|
+
<p>It lets you debug assertion failures interactively.</p>
|
1596
|
+
</li>
|
1256
1597
|
|
1257
|
-
<
|
1598
|
+
<li>
|
1599
|
+
<p>It keeps a detailed report of assertion failures.</p>
|
1600
|
+
</li>
|
1258
1601
|
|
1259
|
-
<
|
1602
|
+
<li>
|
1603
|
+
<p>It lets you nest tests and execution hooks.</p>
|
1604
|
+
</li>
|
1260
1605
|
|
1261
|
-
<
|
1606
|
+
<li>
|
1607
|
+
<p>Its core consists of a mere 378 lines of code.</p>
|
1608
|
+
</li>
|
1609
|
+
</ul></div>
|
1262
1610
|
</div>
|
1263
1611
|
|
1264
1612
|
|
1265
1613
|
|
1266
1614
|
<div class="section" id="Etymology">
|
1267
|
-
<a name="Etymology"/><div class="nav"><a title="
|
1615
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Etymology"/><div class="nav"><a title="Here" href="#Etymology"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Features"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#License"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Etymology"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1268
1616
|
<h1 class="title">
|
1269
|
-
1.
|
1617
|
+
<span class="section_number">1.2 </span>Etymology
|
1270
1618
|
</h1>
|
1271
1619
|
<div class="content"><p>Dfect is named after the D F E C T methods it provides.</p>
|
1272
1620
|
|
1273
|
-
<p>The name is also play on the word “defect”, whereby the intentional misspelling of “defect” as “dfect” is a defect in itself!
|
1621
|
+
<p>The name is also play on the word “defect”, whereby the intentional misspelling of “defect” as “dfect” is a defect in itself! ;-)</p>
|
1274
1622
|
|
1275
1623
|
<p>This wordplay is similar to <a href='http://www.erlang.org/doc/apps/mnesia/index.html'>Mnesia</a>’s play on the word “amnesia”, whereby the intentional omission of the letter “A” indicates forgetfulness—the key characteristic of having amnesia. Clever!</p></div>
|
1276
1624
|
</div>
|
@@ -1278,9 +1626,9 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1278
1626
|
|
1279
1627
|
|
1280
1628
|
<div class="section" id="License">
|
1281
|
-
<a name="License"/><div class="nav"><a title="
|
1629
|
+
<div style="display: none"><br/><hr/><br/></div><a name="License"/><div class="nav"><a title="Here" href="#License"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Etymology"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Credits"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-License"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1282
1630
|
<h1 class="title">
|
1283
|
-
1.
|
1631
|
+
<span class="section_number">1.3 </span>License
|
1284
1632
|
</h1>
|
1285
1633
|
<div class="content"><p>(the ISC license)</p>
|
1286
1634
|
|
@@ -1294,25 +1642,25 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1294
1642
|
|
1295
1643
|
|
1296
1644
|
<div class="section" id="Credits">
|
1297
|
-
<a name="Credits"/><div class="nav"><a title="
|
1645
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Credits"/><div class="nav"><a title="Here" href="#Credits"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#License"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Related-works"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Credits"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1298
1646
|
<h1 class="title">
|
1299
|
-
1.
|
1647
|
+
<span class="section_number">1.4 </span>Credits
|
1300
1648
|
</h1>
|
1301
|
-
<div class="content"><p>Dfect is made possible by <a class="xref" href="#History" title="
|
1649
|
+
<div class="content"><p>Dfect is made possible by <a class="xref" href="#History" title="Part 4. "History"">contributions</a> from users like you:</p>
|
1302
1650
|
|
1303
1651
|
<ul>
|
1304
|
-
<li
|
1652
|
+
<li>François Beausoleil <a href='http://github.com/francois'>http://github.com/francois</a></li>
|
1305
1653
|
|
1306
|
-
<li
|
1654
|
+
<li>Iñaki Baz Castillo <a href='http://github.com/ibc'>http://github.com/ibc</a></li>
|
1307
1655
|
</ul></div>
|
1308
1656
|
</div>
|
1309
1657
|
|
1310
1658
|
|
1311
1659
|
|
1312
1660
|
<div class="section" id="Related-works">
|
1313
|
-
<a name="Related-works"/><div class="nav"><a title="
|
1661
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Related-works"/><div class="nav"><a title="Here" href="#Related-works"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Credits"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Setup"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Related-works"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1314
1662
|
<h1 class="title">
|
1315
|
-
1.
|
1663
|
+
<span class="section_number">1.5 </span>Related works
|
1316
1664
|
</h1>
|
1317
1665
|
<div class="content"><ul>
|
1318
1666
|
<li><a href='http://assert2.rubyforge.org'>assert{ 2.0 }</a></li>
|
@@ -1329,7 +1677,7 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1329
1677
|
|
1330
1678
|
<li><a href='http://test-spec.rubyforge.org/test-spec'>test-spec</a></li>
|
1331
1679
|
|
1332
|
-
<li><a href='http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/
|
1680
|
+
<li><a href='http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/'>Test::Unit</a></li>
|
1333
1681
|
|
1334
1682
|
<li><a href='http://github.com/ahoward/testy/tree/master'>Testy</a></li>
|
1335
1683
|
|
@@ -1340,62 +1688,82 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1340
1688
|
</div>
|
1341
1689
|
|
1342
1690
|
|
1343
|
-
|
1344
|
-
|
1345
|
-
<div class="chapter" id="Setup">
|
1346
|
-
<a name="Setup"/><div class="nav"><a title="Focus this segment" href="#Setup"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Related-works"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Requirements"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Setup"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1691
|
+
<div class="part" id="Setup">
|
1692
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Setup"/><div class="nav"><a title="Here" href="#Setup"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Related-works"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Prerequisites"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Setup"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1347
1693
|
<h1 class="title">
|
1348
|
-
|
1694
|
+
Part 2
|
1349
1695
|
<br/>
|
1350
1696
|
<big>Setup</big>
|
1351
1697
|
</h1>
|
1352
|
-
<div class="content"><div class="tabs"><ul><li><a href="#
|
1353
|
-
<div class="section" id="
|
1354
|
-
<a name="
|
1698
|
+
<div class="content"><div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Prerequisites"><span class="section_number">2.1 </span>Prerequisites</a></li><li><a href="#Installing"><span class="section_number">2.2 </span>Installing</a></li><li><a href="#Upgrading"><span class="section_number">2.3 </span>Upgrading</a></li><li><a href="#Uninstalling"><span class="section_number">2.4 </span>Uninstalling</a></li></ul>
|
1699
|
+
<div class="section" id="Prerequisites">
|
1700
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Prerequisites"/><div class="nav"><a title="Here" href="#Prerequisites"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Setup"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Installing"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Prerequisites"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1355
1701
|
<h1 class="title">
|
1356
|
-
2.1  
|
1702
|
+
<span class="section_number">2.1 </span>Prerequisites
|
1357
1703
|
</h1>
|
1358
|
-
<div class="content"><
|
1704
|
+
<div class="content"><ul>
|
1705
|
+
<li>
|
1706
|
+
<p><a href='http://ruby-lang.org'>Ruby</a> 1.8.6 or newer.</p>
|
1707
|
+
</li>
|
1359
1708
|
|
1360
|
-
<
|
1709
|
+
<li>
|
1710
|
+
<p><a href='http://rubygems.org'>RubyGems</a> 1.3.6 or newer.</p>
|
1711
|
+
</li>
|
1712
|
+
|
1713
|
+
<li>
|
1714
|
+
<p><a href='http://www.datanoise.com/ruby-debug'>ruby-debug</a> will be used if it is available. Otherwise the standard interactive Ruby shell (IRB) will be used instead.</p>
|
1715
|
+
</li>
|
1716
|
+
</ul></div>
|
1361
1717
|
</div>
|
1362
1718
|
|
1363
|
-
<div class="section" id="Installation">
|
1364
|
-
<a name="Installation"/><div class="nav"><a title="Focus this segment" href="#Installation"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Requirements"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Version-numbers"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Installation"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1365
|
-
<h1 class="title">
|
1366
|
-
2.2 Installation
|
1367
|
-
</h1>
|
1368
|
-
<div class="content"><p>You can install Dfect by running this command:</p>
|
1369
1719
|
|
1370
|
-
<pre>gem install dfect</pre>
|
1371
1720
|
|
1372
|
-
<
|
1373
|
-
|
1374
|
-
<
|
1721
|
+
<div class="section" id="Installing">
|
1722
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Installing"/><div class="nav"><a title="Here" href="#Installing"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Prerequisites"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#gem-install-dfect"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Installing"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1723
|
+
<h1 class="title">
|
1724
|
+
<span class="section_number">2.2 </span>Installing
|
1725
|
+
</h1>
|
1726
|
+
<div class="content">
|
1727
|
+
<div class="_float ui-tabs ui-widget ui-widget-content ui-corner-all command" id="gem-install-dfect">
|
1728
|
+
<div style="display: none"><br/><hr/><br/></div><a name="gem-install-dfect"/><div class="nav"><a title="Here" href="#gem-install-dfect"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Installing"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Upgrading"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-gem-install-dfect"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1729
|
+
<p class="title ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"><span class="section_number">Command 1. </span><tt>gem install dfect</tt></p>
|
1730
|
+
</div>
|
1731
|
+
</div>
|
1375
1732
|
</div>
|
1376
1733
|
|
1377
|
-
|
1378
|
-
|
1379
|
-
<div class="section" id="Version-numbers">
|
1380
|
-
<a name="Version-numbers"/><div class="nav"><a title="Focus this segment" href="#Version-numbers"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Installation"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Usage"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Version-numbers"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1734
|
+
<div class="section" id="Upgrading">
|
1735
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Upgrading"/><div class="nav"><a title="Here" href="#Upgrading"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#gem-install-dfect"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#gem-update-dfect"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Upgrading"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1381
1736
|
<h1 class="title">
|
1382
|
-
2.3  
|
1737
|
+
<span class="section_number">2.3 </span>Upgrading
|
1383
1738
|
</h1>
|
1384
|
-
<div class="content"
|
1739
|
+
<div class="content">
|
1740
|
+
<div class="_float ui-tabs ui-widget ui-widget-content ui-corner-all command" id="gem-update-dfect">
|
1741
|
+
<div style="display: none"><br/><hr/><br/></div><a name="gem-update-dfect"/><div class="nav"><a title="Here" href="#gem-update-dfect"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Upgrading"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Uninstalling"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-gem-update-dfect"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1742
|
+
<p class="title ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"><span class="section_number">Command 2. </span><tt>gem update dfect</tt></p>
|
1743
|
+
</div>
|
1744
|
+
</div>
|
1745
|
+
</div>
|
1385
1746
|
|
1386
|
-
<
|
1747
|
+
<div class="section" id="Uninstalling">
|
1748
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Uninstalling"/><div class="nav"><a title="Here" href="#Uninstalling"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#gem-update-dfect"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#gem-uninstall-dfect"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Uninstalling"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1749
|
+
<h1 class="title">
|
1750
|
+
<span class="section_number">2.4 </span>Uninstalling
|
1751
|
+
</h1>
|
1752
|
+
<div class="content">
|
1753
|
+
<div class="_float ui-tabs ui-widget ui-widget-content ui-corner-all command" id="gem-uninstall-dfect">
|
1754
|
+
<div style="display: none"><br/><hr/><br/></div><a name="gem-uninstall-dfect"/><div class="nav"><a title="Here" href="#gem-uninstall-dfect"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Uninstalling"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Usage"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-gem-uninstall-dfect"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1755
|
+
<p class="title ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"><span class="section_number">Command 3. </span><tt>gem uninstall dfect</tt></p>
|
1756
|
+
</div>
|
1757
|
+
</div>
|
1387
1758
|
</div>
|
1388
1759
|
</div></div>
|
1389
1760
|
</div>
|
1390
1761
|
|
1391
1762
|
|
1392
|
-
|
1393
|
-
|
1394
|
-
|
1395
|
-
<div class="chapter" id="Usage">
|
1396
|
-
<a name="Usage"/><div class="nav"><a title="Focus this segment" href="#Usage"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Version-numbers"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Assertions"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Usage"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1763
|
+
<div class="part" id="Usage">
|
1764
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Usage"/><div class="nav"><a title="Here" href="#Usage"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#gem-uninstall-dfect"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Assertions"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Usage"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1397
1765
|
<h1 class="title">
|
1398
|
-
|
1766
|
+
Part 3
|
1399
1767
|
<br/>
|
1400
1768
|
<big>Usage</big>
|
1401
1769
|
</h1>
|
@@ -1403,7 +1771,7 @@ jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(v
|
|
1403
1771
|
|
1404
1772
|
<ins><pre lang="ruby" class="para">require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">rubygems</span><span style="color:#710">'</span></span> <span style="color:#888"># only necessary if you are using Ruby 1.8</span>
|
1405
1773
|
require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect</span><span style="color:#710">'</span></span>
|
1406
|
-
</pre></ins><p> You now have access to the <
|
1774
|
+
</pre></ins><p> You now have access to the <code class="line"><span style="color:#036;font-weight:bold">Dfect</span></code> module, which provides methods that can be either mixed-in or called directly, according to your preference:</p>
|
1407
1775
|
|
1408
1776
|
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">hello</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span> <span style="color:#888"># D() is a class method</span>
|
1409
1777
|
puts <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">world</span><span style="color:#710">"</span></span>
|
@@ -1416,39 +1784,43 @@ include <span style="color:#036;font-weight:bold">Dfect</span> <span style
|
|
1416
1784
|
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">hello</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span> <span style="color:#888"># D() is an instance method</span>
|
1417
1785
|
puts <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">world</span><span style="color:#710">"</span></span>
|
1418
1786
|
<span style="color:#080;font-weight:bold">end</span>
|
1419
|
-
</pre></ins
|
1787
|
+
</pre></ins>
|
1420
1788
|
|
1421
|
-
<div
|
1789
|
+
<div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Assertions"><span class="section_number">3.1 </span>Assertions</a></li><li><a href="#Tests"><span class="section_number">3.2 </span>Tests</a></li></ul>
|
1422
1790
|
<div class="section" id="Assertions">
|
1423
|
-
<a name="Assertions"/><div class="nav"><a title="
|
1791
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Assertions"/><div class="nav"><a title="Here" href="#Assertions"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Usage"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Negation"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Assertions"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1424
1792
|
<h1 class="title">
|
1425
|
-
3.1  
|
1793
|
+
<span class="section_number">3.1 </span>Assertions
|
1426
1794
|
</h1>
|
1427
|
-
<div class="content"><p>The following methods accept a block parameter and assert something about the result of executing that block. They also accept an optional message, which is shown in <a class="xref" href="#Failures" title="Section 3.1.
|
1795
|
+
<div class="content"><p>The following methods accept a block parameter and assert something about the result of executing that block. They also accept an optional message, which is shown in <a class="xref" href="#Failures" title="Section 3.1.3. "Failures"">failure reports</a> if they fail.</p>
|
1428
1796
|
|
1429
|
-
<p>See the <a href='
|
1797
|
+
<p>See the <a href='api/index.html'>API reference</a> for more details and examples.</p>
|
1430
1798
|
|
1431
|
-
<ins><table border="1"><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td>T</td><td>assert true (not <code class="line"><span style="color:#038;font-weight:bold">nil</span></code> and not <code class="line"><span style="color:#038;font-weight:bold">false</span></code>)</td></tr><tr><td>F</td><td>assert not true (<code class="line"><span style="color:#038;font-weight:bold">nil</span></code> or <code class="line"><span style="color:#038;font-weight:bold">false</span></code>)</td></tr><tr><td>E</td><td>assert that an execption is raised</td></tr><tr><td>C</td><td>assert that a symbol is thrown</td></tr></tbody></table></ins><div class="tabs"><ul><li><a href="#Negation">Negation</a></li><li><a href="#Sampling">Sampling</a></li><li><a href="#Failures">Failures</a></li></ul>
|
1432
|
-
<div class="
|
1433
|
-
<a name="Negation"/><div class="nav"><a title="
|
1434
|
-
<
|
1799
|
+
<ins><table border="1"><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td>T</td><td>assert true (not <code class="line"><span style="color:#038;font-weight:bold">nil</span></code> and not <code class="line"><span style="color:#038;font-weight:bold">false</span></code>)</td></tr><tr><td>F</td><td>assert not true (<code class="line"><span style="color:#038;font-weight:bold">nil</span></code> or <code class="line"><span style="color:#038;font-weight:bold">false</span></code>)</td></tr><tr><td>E</td><td>assert that an execption is raised</td></tr><tr><td>C</td><td>assert that a symbol is thrown</td></tr></tbody></table></ins><div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Negation"><span class="section_number">3.1.1 </span>Negation</a></li><li><a href="#Sampling"><span class="section_number">3.1.2 </span>Sampling</a></li><li><a href="#Failures"><span class="section_number">3.1.3 </span>Failures</a></li><li><a href="#Emulation"><span class="section_number">3.1.4 </span>Emulation</a></li></ul>
|
1800
|
+
<div class="section" id="Negation">
|
1801
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Negation"/><div class="nav"><a title="Here" href="#Negation"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Assertions"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Sampling"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Negation"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1802
|
+
<h1 class="title">
|
1803
|
+
<span class="section_number">3.1.1 </span>Negation
|
1804
|
+
</h1>
|
1435
1805
|
<div class="content"><p>These methods are the <em>opposite</em> of <a class="xref" href="#Assertions" title="Section 3.1. "Assertions"">normal assertions</a>.</p>
|
1436
1806
|
|
1437
1807
|
<ins><table border="1"><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td>T!</td><td>same as F</td></tr><tr><td>F!</td><td>same as T</td></tr><tr><td>E!</td><td>assert that an exception is <em>not</em> raised</td></tr><tr><td>C!</td><td>assert that a symbol is <em>not</em> thrown</td></tr></tbody></table></ins></div>
|
1438
1808
|
</div>
|
1439
1809
|
|
1440
|
-
<div class="
|
1441
|
-
<a name="Sampling"/><div class="nav"><a title="
|
1442
|
-
<
|
1443
|
-
|
1810
|
+
<div class="section" id="Sampling">
|
1811
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Sampling"/><div class="nav"><a title="Here" href="#Sampling"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Negation"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Failures"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Sampling"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1812
|
+
<h1 class="title">
|
1813
|
+
<span class="section_number">3.1.2 </span>Sampling
|
1814
|
+
</h1>
|
1815
|
+
<div class="content"><p>These methods allow you to <em>check the outcome</em> of an assertion without recording a success or failure for that assertion in the execution report.</p>
|
1444
1816
|
|
1445
1817
|
<ins><table border="1"><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td>T?</td><td>returns <code class="line"><span style="color:#038;font-weight:bold">true</span></code> if T passes; <code class="line"><span style="color:#038;font-weight:bold">false</span></code> otherwise</td></tr><tr><td>F?</td><td>returns <code class="line"><span style="color:#038;font-weight:bold">true</span></code> if F passes; <code class="line"><span style="color:#038;font-weight:bold">false</span></code> otherwise</td></tr><tr><td>E?</td><td>returns <code class="line"><span style="color:#038;font-weight:bold">true</span></code> if E passes; <code class="line"><span style="color:#038;font-weight:bold">false</span></code> otherwise</td></tr><tr><td>C?</td><td>returns <code class="line"><span style="color:#038;font-weight:bold">true</span></code> if C passes; <code class="line"><span style="color:#038;font-weight:bold">false</span></code> otherwise</td></tr></tbody></table></ins></div>
|
1446
1818
|
</div>
|
1447
1819
|
|
1448
1820
|
<div class="section" id="Failures">
|
1449
|
-
<a name="Failures"/><div class="nav"><a title="
|
1821
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Failures"/><div class="nav"><a title="Here" href="#Failures"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Sampling"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Emulation"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Failures"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1450
1822
|
<h1 class="title">
|
1451
|
-
3.1.
|
1823
|
+
<span class="section_number">3.1.3 </span>Failures
|
1452
1824
|
</h1>
|
1453
1825
|
<div class="content"><p>When an assertion fails, details about the failure will be shown:</p>
|
1454
1826
|
|
@@ -1473,21 +1845,39 @@ include <span style="color:#036;font-weight:bold">Dfect</span> <span style
|
|
1473
1845
|
- test/simple.rb:17
|
1474
1846
|
- test/simple.rb:3</pre>
|
1475
1847
|
|
1476
|
-
<p>You will then be placed into a debugger to investigate the failure if the <code class="line"><span style="color:#A60">:debug</span></code> option is enabled in <
|
1848
|
+
<p>You will then be placed into a debugger to investigate the failure if the <code class="line"><span style="color:#A60">:debug</span></code> option is enabled in the <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>.options</code> hash.</p>
|
1477
1849
|
|
1478
|
-
<p>Details about all assertion failures and a trace of all tests executed are stored by Dfect and provided by the <
|
1850
|
+
<p>Details about all assertion failures and a trace of all tests executed are stored by Dfect and provided by the <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>.report()</code> method.</p></div>
|
1851
|
+
</div>
|
1852
|
+
|
1853
|
+
|
1854
|
+
|
1855
|
+
<div class="section" id="Emulation">
|
1856
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Emulation"/><div class="nav"><a title="Here" href="#Emulation"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Failures"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Tests"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Emulation"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1857
|
+
<h1 class="title">
|
1858
|
+
<span class="section_number">3.1.4 </span>Emulation
|
1859
|
+
</h1>
|
1860
|
+
<div class="content"><p>Dfect provides emulation layers for several popular testing libraries:</p>
|
1861
|
+
|
1862
|
+
<ul>
|
1863
|
+
<li><tt>dfect/unit</tt> — Test::Unit</li>
|
1864
|
+
|
1865
|
+
<li><tt>dfect/mini</tt> — Minitest</li>
|
1866
|
+
|
1867
|
+
<li><tt>dfect/spec</tt> — RSpec</li>
|
1868
|
+
</ul>
|
1869
|
+
|
1870
|
+
<p>Simply <code class="line">require()</code> one of these emulation layers into your test suite and you can write your tests using the familiar syntax of that testing library. See <a href='http://github.com/sunaku/dfect/tree/master/lib/dfect/'>their source code</a> for more details.</p></div>
|
1479
1871
|
</div>
|
1480
1872
|
</div></div>
|
1481
1873
|
</div>
|
1482
1874
|
|
1483
1875
|
<div class="section" id="Tests">
|
1484
|
-
<a name="Tests"/><div class="nav"><a title="
|
1876
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Tests"/><div class="nav"><a title="Here" href="#Tests"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Emulation"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Execution"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Tests"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1485
1877
|
<h1 class="title">
|
1486
|
-
3.2  
|
1878
|
+
<span class="section_number">3.2 </span>Tests
|
1487
1879
|
</h1>
|
1488
|
-
<div class="content"><p>The <
|
1489
|
-
|
1490
|
-
<p>A test may also contain nested tests.</p>
|
1880
|
+
<div class="content"><p>The <code class="line">D()</code> method defines a new Dfect <strong>test</strong>, which is analagous to the concept of <strong>test case</strong> in xUnit or <strong>describe</strong> in rSpec. A test may contain nested tests.</p>
|
1491
1881
|
|
1492
1882
|
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">outer test</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1493
1883
|
<span style="color:#888"># assertions and logic here</span>
|
@@ -1498,13 +1888,44 @@ include <span style="color:#036;font-weight:bold">Dfect</span> <span style
|
|
1498
1888
|
<span style="color:#080;font-weight:bold">end</span>
|
1499
1889
|
</pre></ins>
|
1500
1890
|
|
1501
|
-
<div class="tabs"><ul><li><a href="#
|
1891
|
+
<div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Execution"><span class="section_number">3.2.1 </span>Execution</a></li><li><a href="#Sharing"><span class="section_number">3.2.2 </span>Sharing</a></li><li><a href="#Insulation"><span class="section_number">3.2.3 </span>Insulation</a></li></ul>
|
1892
|
+
<div class="section" id="Execution">
|
1893
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Execution"/><div class="nav"><a title="Here" href="#Execution"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Tests"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Hooks"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Execution"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1894
|
+
<h1 class="title">
|
1895
|
+
<span class="section_number">3.2.1 </span>Execution
|
1896
|
+
</h1>
|
1897
|
+
<div class="content"><p>Tests are executed in depth-first order.</p>
|
1898
|
+
|
1899
|
+
<p>You can configure the test execution process using:</p>
|
1900
|
+
|
1901
|
+
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.options = your_options_hash
|
1902
|
+
</pre></ins><p> You can execute all tests defined thus far using:</p>
|
1903
|
+
|
1904
|
+
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.run
|
1905
|
+
</pre></ins><p> You can stop the execution at any time using:</p>
|
1906
|
+
|
1907
|
+
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.stop
|
1908
|
+
</pre></ins><p> You can view the results of execution using:</p>
|
1909
|
+
|
1910
|
+
<ins><pre lang="ruby" class="para">puts <span style="color:#036;font-weight:bold">Dfect</span>.report.to_yaml
|
1911
|
+
</pre></ins><p> See the <a href='api/index.html'>API reference</a> for details and examples.</p>
|
1912
|
+
|
1913
|
+
|
1914
|
+
<div class="paragraph" id="Automatic-test-execution">
|
1915
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Automatic-test-execution"/><div class="nav"><a title="Here" href="#Automatic-test-execution"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
1916
|
+
<p class="title">Automatic test execution</p>
|
1917
|
+
<div class="content"><p>To mix-in the <code class="line"><span style="color:#036;font-weight:bold">Dfect</span></code> module into your program and execute all tests defined by your program before it terminates, simply add the following line at the top of your program:</p>
|
1918
|
+
|
1919
|
+
<ins><pre lang="ruby" class="para">require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect/auto</span><span style="color:#710">'</span></span>
|
1920
|
+
</pre></ins></div>
|
1921
|
+
</div>
|
1922
|
+
<div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Hooks"><span class="section_number">3.2.1.1 </span>Hooks</a></li><li><a href="#Logging"><span class="section_number">3.2.1.2 </span>Logging</a></li></ul>
|
1502
1923
|
<div class="section" id="Hooks">
|
1503
|
-
<a name="Hooks"/><div class="nav"><a title="
|
1924
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Hooks"/><div class="nav"><a title="Here" href="#Hooks"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Execution"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Logging"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Hooks"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1504
1925
|
<h1 class="title">
|
1505
|
-
3.2.1  
|
1926
|
+
<span class="section_number">3.2.1.1 </span>Hooks
|
1506
1927
|
</h1>
|
1507
|
-
<div class="content"><p>The <
|
1928
|
+
<div class="content"><p>The <code class="line">D()</code> method provides several entry points (hooks) into the test execution process:</p>
|
1508
1929
|
|
1509
1930
|
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">outer test</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1510
1931
|
<span style="color:#036;font-weight:bold">D</span> .< { puts <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">before each nested test</span><span style="color:#710">"</span></span> }
|
@@ -1523,441 +1944,353 @@ include <span style="color:#036;font-weight:bold">Dfect</span> <span style
|
|
1523
1944
|
</pre></ins></div>
|
1524
1945
|
</div>
|
1525
1946
|
|
1526
|
-
<div class="section" id="
|
1527
|
-
<a name="
|
1947
|
+
<div class="section" id="Logging">
|
1948
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Logging"/><div class="nav"><a title="Here" href="#Logging"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Hooks"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Logging-information-in-the-execution-report"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Logging"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1528
1949
|
<h1 class="title">
|
1529
|
-
3.2.2  
|
1950
|
+
<span class="section_number">3.2.1.2 </span>Logging
|
1530
1951
|
</h1>
|
1531
|
-
<div class="content"><p>
|
1952
|
+
<div class="content"><p>The <code class="line">L()</code> method lets you insert log messages, composed of arbitrary Ruby objects, into the test execution report.</p>
|
1532
1953
|
|
1533
|
-
<ins><pre lang="ruby" class="para"><span style="color:#080;font-weight:bold">class</span> << <span style="color:#B06;font-weight:bold">Object</span>.new
|
1534
|
-
<span style="color:#888"># your test logic here</span>
|
1535
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1536
|
-
</pre></ins><p> Inside this insulated environment, you are free to:</p>
|
1537
1954
|
|
1538
|
-
<
|
1539
|
-
<
|
1955
|
+
<div class="_float ui-tabs ui-widget ui-widget-content ui-corner-all example" id="Logging-information-in-the-execution-report">
|
1956
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Logging-information-in-the-execution-report"/><div class="nav"><a title="Here" href="#Logging-information-in-the-execution-report"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Logging"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Sharing"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Logging-information-in-the-execution-report"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1957
|
+
<p class="title ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"><span class="section_number">Example 1. </span>Logging information in the execution report</p>
|
1958
|
+
<div class="content"><p>When the following test is run:</p>
|
1540
1959
|
|
1541
|
-
<
|
1542
|
-
</ul>
|
1543
|
-
|
1544
|
-
<p>For example:</p>
|
1545
|
-
|
1546
|
-
<ins><pre lang="ruby" class="para"><span style="color:#080;font-weight:bold">class</span> << <span style="color:#B06;font-weight:bold">Object</span>.new
|
1547
|
-
include <span style="color:#036;font-weight:bold">SomeModule</span>
|
1548
|
-
extend <span style="color:#036;font-weight:bold">AnotherModule</span>
|
1549
|
-
|
1550
|
-
<span style="color:#036;font-weight:bold">YOUR_CONSTANT</span> = <span style="color:#00D;font-weight:bold">123</span>
|
1551
|
-
|
1552
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">your tests here</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1553
|
-
<span style="color:#888"># your test logic here</span>
|
1554
|
-
|
1555
|
-
your_helper_method
|
1556
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1960
|
+
<ins><pre lang="ruby" class="para">require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect/auto</span><span style="color:#710">'</span></span>
|
1557
1961
|
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1561
|
-
helper = <span style="color:#036;font-weight:bold">YourHelperClass</span>.new
|
1562
|
-
helper.do_something_helpful
|
1962
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Wizard</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1963
|
+
<span style="color:#036;font-weight:bold">L</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Preparing spell to defeat mortal foes...</span><span style="color:#710">'</span></span>
|
1964
|
+
<span style="color:#080;font-weight:bold">end</span>
|
1563
1965
|
|
1564
|
-
|
1565
|
-
<span style="color:#
|
1966
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Magician</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1967
|
+
<span style="color:#036;font-weight:bold">L</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Preparing rabbits to pull from hat...</span><span style="color:#710">'</span></span>, rand(<span style="color:#00D;font-weight:bold">15</span>)
|
1968
|
+
<span style="color:#080;font-weight:bold">end</span>
|
1566
1969
|
|
1567
|
-
|
1568
|
-
|
1569
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1970
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Calculator</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1971
|
+
<span style="color:#036;font-weight:bold">L</span> <span style="color:#036;font-weight:bold">Math</span>::<span style="color:#036;font-weight:bold">PI</span>, [<span style="color:#00D;font-weight:bold">1</span>, <span style="color:#00D;font-weight:bold">2</span>, <span style="color:#00D;font-weight:bold">3</span>, [<span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">a</span><span style="color:#710">'</span></span>, <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">b</span><span style="color:#710">'</span></span>, <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">c</span><span style="color:#710">'</span></span>]], {<span style="color:#A60">:foo</span> => <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">bar!</span><span style="color:#710">'</span></span>}
|
1570
1972
|
<span style="color:#080;font-weight:bold">end</span>
|
1571
|
-
</pre></ins
|
1973
|
+
</pre></ins><p> Dfect will output the following:</p>
|
1974
|
+
|
1975
|
+
<pre>---
|
1976
|
+
- Wizard:
|
1977
|
+
- Preparing spell to defeat mortal foes...
|
1978
|
+
- Magician:
|
1979
|
+
- Preparing rabbits to pull from hat...
|
1980
|
+
- 9
|
1981
|
+
- Calculator:
|
1982
|
+
- 3.14159265358979
|
1983
|
+
- - 1
|
1984
|
+
- 2
|
1985
|
+
- 3
|
1986
|
+
- - a
|
1987
|
+
- b
|
1988
|
+
- c
|
1989
|
+
- foo: bar!
|
1990
|
+
---
|
1991
|
+
time: 0.000196246</pre></div>
|
1572
1992
|
</div>
|
1573
|
-
</div></div>
|
1574
1993
|
</div>
|
1575
|
-
|
1576
|
-
<div class="section" id="Execution">
|
1577
|
-
<a name="Execution"/><div class="nav"><a title="Focus this segment" href="#Execution"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Insulation"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Automatic-test-execution"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Execution"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1578
|
-
<h1 class="title">
|
1579
|
-
3.3 Execution
|
1580
|
-
</h1>
|
1581
|
-
<div class="content"><p>You can configure test execution using:</p>
|
1582
|
-
|
1583
|
-
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.options = your_options_hash
|
1584
|
-
</pre></ins><p> You can execute all tests defined thus far using:</p>
|
1585
|
-
|
1586
|
-
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.run
|
1587
|
-
</pre></ins><p> You can stop this execution at any time using:</p>
|
1588
|
-
|
1589
|
-
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">Dfect</span>.stop
|
1590
|
-
</pre></ins><p> You can view the results of execution using:</p>
|
1591
|
-
|
1592
|
-
<ins><pre lang="ruby" class="para">puts <span style="color:#036;font-weight:bold">Dfect</span>.report.to_yaml
|
1593
|
-
</pre></ins><p> See the <a href='./api/index.html'>API documentation</a> for details and examples.</p>
|
1594
|
-
|
1595
|
-
<div class="tabs"><ul><li><a href="#Automatic-test-execution">Automatic test execution</a></li></ul>
|
1596
|
-
<div class="section" id="Automatic-test-execution">
|
1597
|
-
<a name="Automatic-test-execution"/><div class="nav"><a title="Focus this segment" href="#Automatic-test-execution"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Execution"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Reporting"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__Automatic-test-execution"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1598
|
-
<h1 class="title">
|
1599
|
-
3.3.1 Automatic test execution
|
1600
|
-
</h1>
|
1601
|
-
<div class="content"><ins><pre lang="ruby" class="para">require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">rubygems</span><span style="color:#710">'</span></span> <span style="color:#888"># only necessary if you are using Ruby 1.8</span>
|
1602
|
-
require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect/auto</span><span style="color:#710">'</span></span> <span style="color:#888"># <== notice the "auto"</span>
|
1603
|
-
</pre></ins> The above code will mix-in the <code class="line"><span style="color:#036;font-weight:bold">Dfect</span></code> module into your program and will execute all tests defined by your program before it terminates.</div>
|
1604
1994
|
</div>
|
1605
1995
|
</div></div>
|
1606
1996
|
</div>
|
1607
1997
|
|
1608
|
-
<div class="section" id="
|
1609
|
-
<a name="
|
1998
|
+
<div class="section" id="Sharing">
|
1999
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Sharing"/><div class="nav"><a title="Here" href="#Sharing"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Logging-information-in-the-execution-report"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Sharing-code-between-tests"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Sharing"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1610
2000
|
<h1 class="title">
|
1611
|
-
3.
|
2001
|
+
<span class="section_number">3.2.2 </span>Sharing
|
1612
2002
|
</h1>
|
1613
|
-
<div class="content"><p>
|
2003
|
+
<div class="content"><p>The <code class="line">S()</code> method is a mechanism for sharing code. When called with a block, it shares the given block (under a given identifier) for injection into other tests. When called without a block, it injects a previously shared block (under a given identifier) into the environment where it is called.</p>
|
1614
2004
|
|
1615
|
-
<p>
|
1616
|
-
</div>
|
2005
|
+
<p>The <code class="line">S!()</code> method is a combination of the two uses of the <code class="line">S()</code> method: it lets you simultaneously share a block of code while injecting it into the environment where that method is called.</p>
|
1617
2006
|
|
2007
|
+
<p>The <code class="line">S?()</code> method simply checks whether any code has been shared under a given identifier.</p>
|
1618
2008
|
|
1619
2009
|
|
1620
|
-
<div class="
|
1621
|
-
<a name="
|
1622
|
-
<
|
1623
|
-
|
1624
|
-
</h1>
|
1625
|
-
<div class="content"><p>Dfect provides emulation layers for several popular testing libraries:</p>
|
2010
|
+
<div class="_float ui-tabs ui-widget ui-widget-content ui-corner-all example" id="Sharing-code-between-tests">
|
2011
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Sharing-code-between-tests"/><div class="nav"><a title="Here" href="#Sharing-code-between-tests"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Sharing"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Insulation"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Sharing-code-between-tests"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2012
|
+
<p class="title ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"><span class="section_number">Example 2. </span>Sharing code between tests</p>
|
2013
|
+
<div class="content"><p>When the following test is run:</p>
|
1626
2014
|
|
1627
|
-
<
|
1628
|
-
<li><tt>dfect/unit</tt> — Test::Unit</li>
|
2015
|
+
<ins><pre lang="ruby" class="para">require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect/auto</span><span style="color:#710">'</span></span>
|
1629
2016
|
|
1630
|
-
<
|
2017
|
+
<span style="color:#036;font-weight:bold">S</span> <span style="color:#A60">:knowledge</span> <span style="color:#080;font-weight:bold">do</span>
|
2018
|
+
<span style="color:#036;font-weight:bold">L</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Knowledge is power!</span><span style="color:#710">'</span></span>
|
2019
|
+
<span style="color:#080;font-weight:bold">end</span>
|
1631
2020
|
|
1632
|
-
<
|
1633
|
-
</
|
2021
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Healer</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2022
|
+
<span style="color:#036;font-weight:bold">S</span> <span style="color:#A60">:knowledge</span>
|
2023
|
+
<span style="color:#080;font-weight:bold">end</span>
|
1634
2024
|
|
1635
|
-
<
|
2025
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Warrior</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2026
|
+
S! <span style="color:#A60">:strength</span> <span style="color:#080;font-weight:bold">do</span>
|
2027
|
+
<span style="color:#036;font-weight:bold">L</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Strength is power!</span><span style="color:#710">'</span></span>
|
2028
|
+
<span style="color:#080;font-weight:bold">end</span>
|
2029
|
+
<span style="color:#080;font-weight:bold">end</span>
|
2030
|
+
|
2031
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Wizard</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2032
|
+
<span style="color:#036;font-weight:bold">S</span> <span style="color:#A60">:knowledge</span>
|
2033
|
+
<span style="color:#036;font-weight:bold">S</span> <span style="color:#A60">:strength</span>
|
2034
|
+
<span style="color:#080;font-weight:bold">end</span>
|
1636
2035
|
|
1637
|
-
<
|
2036
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">King</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2037
|
+
<span style="color:#036;font-weight:bold">T</span> { S? <span style="color:#A60">:knowledge</span> }
|
2038
|
+
<span style="color:#036;font-weight:bold">T</span> { S? <span style="color:#A60">:strength</span> }
|
2039
|
+
<span style="color:#036;font-weight:bold">F</span> { S? <span style="color:#A60">:power</span> }
|
2040
|
+
<span style="color:#036;font-weight:bold">L</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">Power is power!</span><span style="color:#710">'</span></span>
|
2041
|
+
<span style="color:#080;font-weight:bold">end</span>
|
2042
|
+
</pre></ins><p> Dfect will output the following:</p>
|
2043
|
+
|
2044
|
+
<pre>---
|
2045
|
+
- Healer:
|
2046
|
+
- Knowledge is power!
|
2047
|
+
- Warrior:
|
2048
|
+
- Strength is power!
|
2049
|
+
- Wizard:
|
2050
|
+
- Knowledge is power!
|
2051
|
+
- Strength is power!
|
2052
|
+
- King:
|
2053
|
+
- Power is power!
|
2054
|
+
---
|
2055
|
+
pass: 3
|
2056
|
+
time: 0.00045127</pre></div>
|
2057
|
+
</div>
|
1638
2058
|
</div>
|
1639
2059
|
</div>
|
1640
2060
|
|
2061
|
+
<div class="section" id="Insulation">
|
2062
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Insulation"/><div class="nav"><a title="Here" href="#Insulation"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Sharing-code-between-tests"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Insulated-and-uninsulated-tests"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Insulation"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2063
|
+
<h1 class="title">
|
2064
|
+
<span class="section_number">3.2.3 </span>Insulation
|
2065
|
+
</h1>
|
2066
|
+
<div class="content"><p>The <code class="line">D!()</code> method defines a new test that is explicitly insulated from the tests that contain it and also from the top-level Ruby environment. Root-level calls to the <code class="line">D()</code> method are insulated by default.</p>
|
1641
2067
|
|
1642
|
-
<
|
1643
|
-
<a name="A-sample-unit-test"/><div class="nav"><a title="Focus this segment" href="#A-sample-unit-test"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#Emulation"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#History"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__A-sample-unit-test"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1644
|
-
<p class="title">Example 1. A sample unit test</p>
|
1645
|
-
<div class="content"><p>The following code is from Dfect’s very own test suite.</p>
|
1646
|
-
|
1647
|
-
<ins><pre lang="ruby" class="para"><span style="color:#888">#--</span>
|
1648
|
-
<span style="color:#888"># Copyright protects this work.</span>
|
1649
|
-
<span style="color:#888"># See LICENSE file for details.</span>
|
1650
|
-
<span style="color:#888">#++</span>
|
1651
|
-
|
1652
|
-
require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect/auto</span><span style="color:#710">'</span></span>
|
2068
|
+
<p>Inside an insulated test, you are free to:</p>
|
1653
2069
|
|
1654
|
-
<
|
1655
|
-
|
1656
|
-
<span style="color:#036;font-weight:bold">T</span> { !<span style="color:#038;font-weight:bold">false</span> }
|
1657
|
-
<span style="color:#036;font-weight:bold">T</span> { !<span style="color:#038;font-weight:bold">nil</span> }
|
2070
|
+
<ul>
|
2071
|
+
<li>mix-in any modules your test logic needs</li>
|
1658
2072
|
|
1659
|
-
|
1660
|
-
|
2073
|
+
<li>define your own constants, methods, and classes</li>
|
2074
|
+
</ul>
|
1661
2075
|
|
1662
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">must return block value</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1663
|
-
inner = rand()
|
1664
|
-
outer = <span style="color:#036;font-weight:bold">T</span> { inner }
|
1665
2076
|
|
1666
|
-
|
1667
|
-
<
|
1668
|
-
<
|
2077
|
+
<div class="_float ui-tabs ui-widget ui-widget-content ui-corner-all example" id="Insulated-and-uninsulated-tests">
|
2078
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Insulated-and-uninsulated-tests"/><div class="nav"><a title="Here" href="#Insulated-and-uninsulated-tests"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Insulation"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#History"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Insulated-and-uninsulated-tests"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2079
|
+
<p class="title ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"><span class="section_number">Example 3. </span>Insulated and uninsulated tests</p>
|
2080
|
+
<div class="content"><p>When the following test is run:</p>
|
1669
2081
|
|
1670
|
-
<
|
1671
|
-
T! { !<span style="color:#038;font-weight:bold">true</span> }
|
1672
|
-
T! { <span style="color:#038;font-weight:bold">false</span> }
|
1673
|
-
T! { <span style="color:#038;font-weight:bold">nil</span> }
|
2082
|
+
<ins><pre lang="ruby" class="para">require <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">dfect/auto</span><span style="color:#710">'</span></span>
|
1674
2083
|
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
2084
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">a root-level test</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2085
|
+
<span style="color:#33B">@outside</span> = <span style="color:#00D;font-weight:bold">1</span>
|
2086
|
+
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#080;font-weight:bold">defined?</span> <span style="color:#33B">@outside</span> }
|
2087
|
+
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#33B">@outside</span> == <span style="color:#00D;font-weight:bold">1</span> }
|
1678
2088
|
|
1679
|
-
|
2089
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">an inner, non-insulated test</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2090
|
+
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#080;font-weight:bold">defined?</span> <span style="color:#33B">@outside</span> }
|
2091
|
+
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#33B">@outside</span> == <span style="color:#00D;font-weight:bold">1</span> }
|
1680
2092
|
<span style="color:#080;font-weight:bold">end</span>
|
1681
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1682
|
-
|
1683
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">T?()</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1684
|
-
<span style="color:#036;font-weight:bold">T</span> { T? { <span style="color:#038;font-weight:bold">true</span> } }
|
1685
|
-
<span style="color:#036;font-weight:bold">F</span> { T? { <span style="color:#038;font-weight:bold">false</span> } }
|
1686
|
-
<span style="color:#036;font-weight:bold">F</span> { T? { <span style="color:#038;font-weight:bold">nil</span> } }
|
1687
2093
|
|
1688
|
-
|
1689
|
-
|
1690
|
-
|
2094
|
+
D! <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">an inner, insulated test</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2095
|
+
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#080;font-weight:bold">defined?</span> <span style="color:#33B">@outside</span> }
|
2096
|
+
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#33B">@outside</span> == <span style="color:#00D;font-weight:bold">1</span> }
|
1691
2097
|
|
1692
|
-
<span style="color:#
|
1693
|
-
<span style="color:#036;font-weight:bold">T</span> {
|
2098
|
+
<span style="color:#33B">@inside</span> = <span style="color:#00D;font-weight:bold">2</span>
|
2099
|
+
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#080;font-weight:bold">defined?</span> <span style="color:#33B">@inside</span> }
|
2100
|
+
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#33B">@inside</span> == <span style="color:#00D;font-weight:bold">2</span> }
|
1694
2101
|
<span style="color:#080;font-weight:bold">end</span>
|
1695
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1696
|
-
|
1697
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">F() must be same as T!()</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1698
|
-
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#036;font-weight:bold">D</span>.method(<span style="color:#A60">:F</span>) == <span style="color:#036;font-weight:bold">D</span>.method(<span style="color:#A60">:T!</span>) }
|
1699
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1700
2102
|
|
1701
|
-
<span style="color:#036;font-weight:bold">
|
1702
|
-
<span style="color:#036;font-weight:bold">
|
2103
|
+
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#080;font-weight:bold">defined?</span> <span style="color:#33B">@inside</span> }
|
2104
|
+
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#33B">@inside</span> == <span style="color:#00D;font-weight:bold">2</span> }
|
1703
2105
|
<span style="color:#080;font-weight:bold">end</span>
|
2106
|
+
</pre></ins><p> Dfect will output the following:</p>
|
1704
2107
|
|
1705
|
-
<
|
1706
|
-
|
1707
|
-
|
1708
|
-
<span style="color:#036;font-weight:bold">F</span> { T? { <span style="color:#038;font-weight:bold">nil</span> } }
|
1709
|
-
|
1710
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">must not return block value</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1711
|
-
inner = rand()
|
1712
|
-
outer = F? { inner }
|
1713
|
-
|
1714
|
-
<span style="color:#036;font-weight:bold">F</span> { outer == inner }
|
1715
|
-
<span style="color:#036;font-weight:bold">T</span> { outer == <span style="color:#038;font-weight:bold">false</span> }
|
1716
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1717
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2108
|
+
<pre>---
|
2109
|
+
- a root-level test:
|
2110
|
+
- an inner, non-insulated test: []
|
1718
2111
|
|
1719
|
-
|
1720
|
-
E(<span style="color:#036;font-weight:bold">SyntaxError</span>) { raise <span style="color:#036;font-weight:bold">SyntaxError</span> }
|
2112
|
+
- an inner, insulated test: []
|
1721
2113
|
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
<span style="color:#036;font-weight:bold">E</span> { raise }
|
1733
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1734
|
-
|
1735
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">does not default to StandardError when kinds are specified</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1736
|
-
<span style="color:#036;font-weight:bold">F</span> { E?(<span style="color:#036;font-weight:bold">SyntaxError</span>) { raise } }
|
1737
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2114
|
+
---
|
2115
|
+
pass: 10
|
2116
|
+
time: 0.000505745</pre></div>
|
2117
|
+
</div>
|
2118
|
+
</div>
|
2119
|
+
</div>
|
2120
|
+
</div></div>
|
2121
|
+
</div>
|
2122
|
+
</div></div>
|
2123
|
+
</div>
|
1738
2124
|
|
1739
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">allows nested rescue</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1740
|
-
<span style="color:#036;font-weight:bold">E</span> <span style="color:#036;font-weight:bold">SyntaxError</span> <span style="color:#080;font-weight:bold">do</span>
|
1741
|
-
<span style="color:#080;font-weight:bold">begin</span>
|
1742
|
-
raise <span style="color:#036;font-weight:bold">LoadError</span>
|
1743
|
-
<span style="color:#080;font-weight:bold">rescue</span> <span style="color:#036;font-weight:bold">LoadError</span>
|
1744
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1745
2125
|
|
1746
|
-
|
2126
|
+
<div class="part" id="History">
|
2127
|
+
<div style="display: none"><br/><hr/><br/></div><a name="History"/><div class="nav"><a title="Here" href="#History"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Insulated-and-uninsulated-tests"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Version-2-0-0-2010-03-21"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-History"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2128
|
+
<h1 class="title">
|
2129
|
+
Part 4
|
2130
|
+
<br/>
|
2131
|
+
<big>History</big>
|
2132
|
+
</h1>
|
2133
|
+
<div class="content"><div style="display: none"><br/><hr/><br/></div><div class="tabs"><ul><li><a href="#Version-2-0-0-2010-03-21"><span class="section_number">4.1 </span>Version 2.0.0 (2010-03-21)</a></li><li><a href="#Version-1-1-0-2009-10-27"><span class="section_number">4.2 </span>Version 1.1.0 (2009-10-27)</a></li><li><a href="#Version-1-0-1-2009-10-07"><span class="section_number">4.3 </span>Version 1.0.1 (2009-10-07)</a></li><li><a href="#Version-1-0-0-2009-05-03"><span class="section_number">4.4 </span>Version 1.0.0 (2009-05-03)</a></li><li><a href="#Version-0-1-0-2009-04-28"><span class="section_number">4.5 </span>Version 0.1.0 (2009-04-28)</a></li><li><a href="#Version-0-0-0-2009-04-13"><span class="section_number">4.6 </span>Version 0.0.0 (2009-04-13)</a></li></ul>
|
2134
|
+
<div class="section" id="Version-2-0-0-2010-03-21">
|
2135
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Version-2-0-0-2010-03-21"/><div class="nav"><a title="Here" href="#Version-2-0-0-2010-03-21"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#History"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Version-1-1-0-2009-10-27"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Version-2-0-0-2010-03-21"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2136
|
+
<h1 class="title">
|
2137
|
+
<span class="section_number">4.1 </span>Version 2.0.0 (2010-03-21)
|
2138
|
+
</h1>
|
2139
|
+
<div class="content"><p>This release adds the ability to insulate tests from each other, share code between them, makes the order of parameters consistent in the API, improves user interactivity, fixes some bugs, and revises the user manual.</p>
|
1747
2140
|
|
1748
|
-
raise <span style="color:#036;font-weight:bold">SyntaxError</span>
|
1749
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1750
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1751
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1752
2141
|
|
1753
|
-
<
|
1754
|
-
|
2142
|
+
<div class="paragraph" id="Incompatible-changes">
|
2143
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Incompatible-changes"/><div class="nav"><a title="Here" href="#Incompatible-changes"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2144
|
+
<p class="title">Incompatible changes</p>
|
2145
|
+
<div class="content"><ul>
|
2146
|
+
<li>
|
2147
|
+
<p>Root-level calls to the <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::D()</code> method are <a class="xref" href="#Insulation" title="Section 3.2.3. "Insulation"">automatically insulated</a> now.</p>
|
2148
|
+
</li>
|
1755
2149
|
|
1756
|
-
|
1757
|
-
|
1758
|
-
|
2150
|
+
<li>
|
2151
|
+
<p>The <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::E()</code> methods now expects its optional message parameter to be the <em>last parameter</em> in the parameter list.</p>
|
2152
|
+
</li>
|
1759
2153
|
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
2154
|
+
<li>
|
2155
|
+
<p>The <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::C()</code> methods now expect their first parameter to be a symbol instead of the optional message to be shown in case of assertion failure.</p>
|
2156
|
+
</li>
|
1763
2157
|
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
2158
|
+
<li>
|
2159
|
+
<p>The <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::R()</code> has been renamed to <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::L()</code>, which is a mnemonic for <a class="xref" href="#Logging" title="Section 3.2.1.2">Logging</a>.</p>
|
2160
|
+
</li>
|
1767
2161
|
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
2162
|
+
<li>
|
2163
|
+
<p>Shorten names of hash keys in the execution trace for brevity and rename <code class="line"><span style="color:#A60">:raise</span></code> key in report statistics to <code class="line"><span style="color:#A60">:error</span></code>.</p>
|
2164
|
+
</li>
|
1771
2165
|
|
1772
|
-
|
1773
|
-
|
1774
|
-
|
1775
|
-
raise <span style="color:#036;font-weight:bold">LoadError</span>
|
1776
|
-
<span style="color:#080;font-weight:bold">rescue</span> <span style="color:#036;font-weight:bold">LoadError</span>
|
1777
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2166
|
+
<li>
|
2167
|
+
<p>Only the most helpful subset of the failure details is shown before placing the user into a debugger because they can query the omitted information (on demand) inside the debugger.</p>
|
2168
|
+
</li>
|
1778
2169
|
|
1779
|
-
|
2170
|
+
<li>
|
2171
|
+
<p>The execution trace is only shown if all tests passed in <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::run()</code>.</p>
|
2172
|
+
</li>
|
1780
2173
|
|
1781
|
-
|
1782
|
-
|
1783
|
-
|
1784
|
-
|
2174
|
+
<li>
|
2175
|
+
<p>The <code class="line"><span style="color:#A60">:debug</span></code> option is now set to Ruby’s <code class="line"><span style="color:#d70;font-weight:bold">$DEBUG</span></code> global by default.</p>
|
2176
|
+
</li>
|
2177
|
+
</ul></div>
|
2178
|
+
</div>
|
1785
2179
|
|
1786
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">C()</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1787
|
-
C(<span style="color:#A60">:foo</span>) { throw <span style="color:#A60">:foo</span> }
|
1788
2180
|
|
1789
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">forbids block to not throw anything</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1790
|
-
<span style="color:#036;font-weight:bold">F</span> { C?(<span style="color:#A60">:bar</span>) {} }
|
1791
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1792
2181
|
|
1793
|
-
|
1794
|
-
|
1795
|
-
<
|
2182
|
+
<div class="paragraph" id="New-features">
|
2183
|
+
<div style="display: none"><br/><hr/><br/></div><a name="New-features"/><div class="nav"><a title="Here" href="#New-features"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2184
|
+
<p class="title">New features</p>
|
2185
|
+
<div class="content"><ul>
|
2186
|
+
<li>
|
2187
|
+
<p>Print failures as they occur instead of waiting until the end.</p>
|
2188
|
+
</li>
|
1796
2189
|
|
1797
|
-
|
1798
|
-
|
1799
|
-
catch <span style="color:#A60">:bar</span> <span style="color:#080;font-weight:bold">do</span>
|
1800
|
-
throw <span style="color:#A60">:bar</span>
|
1801
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2190
|
+
<li>
|
2191
|
+
<p>Allow passing condition as argument to true/false assertions instead of requiring the condition to be passed as a code block, and also fall back to the binding of inner-most enclosing test or hook when debugging or constructing a failure report for an assertion that was not given a block.</p>
|
1802
2192
|
|
1803
|
-
|
1804
|
-
|
1805
|
-
|
2193
|
+
<p>This allows you to reduce “line noise” in your tests:</p>
|
2194
|
+
</li>
|
2195
|
+
</ul>
|
1806
2196
|
|
1807
|
-
|
1808
|
-
|
1809
|
-
outer = C(<span style="color:#A60">:foo</span>) { throw <span style="color:#A60">:foo</span>, inner }
|
2197
|
+
<ins><pre lang="ruby" class="para"><span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">Lottery</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2198
|
+
winning_ticket = rand()
|
1810
2199
|
|
1811
|
-
|
2200
|
+
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">My chances of winning</span><span style="color:#710">"</span></span> <span style="color:#080;font-weight:bold">do</span>
|
2201
|
+
my_ticket = rand()
|
2202
|
+
<span style="color:#036;font-weight:bold">F</span> my_ticket == winning_ticket, <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">"</span><span style="">I won?! Dream on.</span><span style="color:#710">"</span></span>
|
1812
2203
|
<span style="color:#080;font-weight:bold">end</span>
|
1813
2204
|
<span style="color:#080;font-weight:bold">end</span>
|
2205
|
+
</pre></ins>
|
1814
2206
|
|
1815
|
-
<
|
1816
|
-
|
2207
|
+
<ul>
|
2208
|
+
<li>
|
2209
|
+
<p>Add <a class="xref" href="#Sharing" title="Section 3.2.2. "Sharing""><code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::S()</code> methods</a> for sharing code between tests.</p>
|
2210
|
+
</li>
|
1817
2211
|
|
1818
|
-
|
1819
|
-
|
1820
|
-
|
2212
|
+
<li>
|
2213
|
+
<p>Add <a class="xref" href="#Insulation" title="Section 3.2.3. "Insulation""><code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::D!()</code> method</a> to explicitly insulate a test from other tests, the top-level Ruby environment, and the code being tested.</p>
|
2214
|
+
</li>
|
1821
2215
|
|
1822
|
-
|
1823
|
-
|
1824
|
-
|
2216
|
+
<li>
|
2217
|
+
<p>Add <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::info()</code> method which returns the details of the failure that is currently being debugged by the user.</p>
|
2218
|
+
</li>
|
1825
2219
|
|
1826
|
-
|
1827
|
-
|
1828
|
-
|
1829
|
-
throw <span style="color:#A60">:moz</span>
|
1830
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2220
|
+
<li>
|
2221
|
+
<p>Add instance variables to the <code class="line"><span style="color:#A60">:vars</span></code> section of a failure report.</p>
|
2222
|
+
</li>
|
1831
2223
|
|
1832
|
-
|
1833
|
-
|
1834
|
-
|
2224
|
+
<li>
|
2225
|
+
<p>Add <code class="line">setup!()</code> and <code class="line">teardown!()</code> methods for before-all and after-all hooks in the <tt>dfect/unit</tt> emulation library.</p>
|
2226
|
+
</li>
|
1835
2227
|
|
1836
|
-
|
1837
|
-
|
1838
|
-
|
2228
|
+
<li>
|
2229
|
+
<p>Add test execution time to statistics hash (under the <code class="line"><span style="color:#A60">:time</span></code> key).</p>
|
2230
|
+
</li>
|
2231
|
+
</ul></div>
|
2232
|
+
</div>
|
1839
2233
|
|
1840
|
-
<span style="color:#036;font-weight:bold">F</span> { outer == inner }
|
1841
|
-
<span style="color:#036;font-weight:bold">T</span> { outer == <span style="color:#038;font-weight:bold">nil</span> }
|
1842
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1843
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1844
2234
|
|
1845
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">D()</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1846
|
-
history = []
|
1847
2235
|
|
1848
|
-
|
1849
|
-
<
|
1850
|
-
<
|
1851
|
-
<
|
2236
|
+
<div class="paragraph" id="Bug-fixes">
|
2237
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Bug-fixes"/><div class="nav"><a title="Here" href="#Bug-fixes"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2238
|
+
<p class="title">Bug fixes</p>
|
2239
|
+
<div class="content"><ul>
|
2240
|
+
<li>
|
2241
|
+
<p>Do not print any output when <code class="line"><span style="color:#A60">:quiet</span></code> option is active.</p>
|
2242
|
+
</li>
|
1852
2243
|
|
1853
|
-
|
1854
|
-
|
1855
|
-
|
1856
|
-
<span style="color:#036;font-weight:bold">F</span> { history.select {|x| x == <span style="color:#A60">:after_each</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1857
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:after_all</span> }.length == <span style="color:#00D;font-weight:bold">0</span> }
|
1858
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2244
|
+
<li>
|
2245
|
+
<p>Allow passing multiple strings/objects to <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::D()</code> like in RSpec.</p>
|
2246
|
+
</li>
|
1859
2247
|
|
1860
|
-
|
1861
|
-
|
1862
|
-
|
1863
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:after_each</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1864
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:after_all</span> }.length == <span style="color:#00D;font-weight:bold">0</span> }
|
1865
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2248
|
+
<li>
|
2249
|
+
<p>Make before and after hook methods mixin-able like assertions.</p>
|
2250
|
+
</li>
|
1866
2251
|
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
|
1872
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2252
|
+
<li>
|
2253
|
+
<p>Do not assume that <code class="line"><span style="color:#036;font-weight:bold">Module</span><span style="color:#888">#to_s</span></code> is the same as <code class="line"><span style="color:#036;font-weight:bold">Module</span><span style="color:#888">#name</span></code>.</p>
|
2254
|
+
</li>
|
2255
|
+
</ul></div>
|
2256
|
+
</div>
|
1873
2257
|
|
1874
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">fourth nesting</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1875
|
-
<span style="color:#036;font-weight:bold">D</span> .<< { history << <span style="color:#A60">:nested_before_all</span> }
|
1876
|
-
<span style="color:#036;font-weight:bold">D</span> .< { history << <span style="color:#A60">:nested_before_each</span> }
|
1877
|
-
<span style="color:#036;font-weight:bold">D</span> .> { history << <span style="color:#A60">:nested_after_each</span> }
|
1878
|
-
<span style="color:#036;font-weight:bold">D</span> .>> { history << <span style="color:#A60">:nested_after_all</span> }
|
1879
|
-
|
1880
|
-
nested_before_each = <span style="color:#00D;font-weight:bold">0</span>
|
1881
|
-
|
1882
|
-
<span style="color:#036;font-weight:bold">D</span> .< <span style="color:#080;font-weight:bold">do</span>
|
1883
|
-
<span style="color:#888"># outer values remain the same for this nesting</span>
|
1884
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:before_all</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1885
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:before_each</span> }.length == <span style="color:#00D;font-weight:bold">4</span> }
|
1886
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:after_each</span> }.length == <span style="color:#00D;font-weight:bold">3</span> }
|
1887
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:after_all</span> }.length == <span style="color:#00D;font-weight:bold">0</span> }
|
1888
|
-
|
1889
|
-
nested_before_each += <span style="color:#00D;font-weight:bold">1</span>
|
1890
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_each</span> }.length == nested_before_each }
|
1891
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1892
|
-
|
1893
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">first double-nesting</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1894
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_all</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1895
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_each</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1896
|
-
<span style="color:#036;font-weight:bold">F</span> { history.select {|x| x == <span style="color:#A60">:nested_after_each</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1897
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_after_all</span> }.length == <span style="color:#00D;font-weight:bold">0</span> }
|
1898
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1899
|
-
|
1900
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">second double-nesting</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1901
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_all</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1902
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_each</span> }.length == <span style="color:#00D;font-weight:bold">2</span> }
|
1903
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_after_each</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1904
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_after_all</span> }.length == <span style="color:#00D;font-weight:bold">0</span> }
|
1905
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1906
|
-
|
1907
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">third double-nesting</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1908
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_all</span> }.length == <span style="color:#00D;font-weight:bold">1</span> }
|
1909
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_before_each</span> }.length == <span style="color:#00D;font-weight:bold">3</span> }
|
1910
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_after_each</span> }.length == <span style="color:#00D;font-weight:bold">2</span> }
|
1911
|
-
<span style="color:#036;font-weight:bold">T</span> { history.select {|x| x == <span style="color:#A60">:nested_after_all</span> }.length == <span style="color:#00D;font-weight:bold">0</span> }
|
1912
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1913
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1914
|
-
<span style="color:#080;font-weight:bold">end</span>
|
1915
2258
|
|
1916
|
-
<span style="color:#036;font-weight:bold">D</span> <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">'</span><span style="">D.<() must allow inheritance checking when called without a block</span><span style="color:#710">'</span></span> <span style="color:#080;font-weight:bold">do</span>
|
1917
|
-
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#036;font-weight:bold">D</span> < <span style="color:#036;font-weight:bold">Kernel</span> }
|
1918
|
-
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#036;font-weight:bold">D</span> < <span style="color:#036;font-weight:bold">Object</span> }
|
1919
|
-
<span style="color:#036;font-weight:bold">F</span> { <span style="color:#036;font-weight:bold">D</span> < <span style="color:#036;font-weight:bold">Module</span> }
|
1920
|
-
<span style="color:#036;font-weight:bold">T</span> { <span style="color:#036;font-weight:bold">D</span>.class == <span style="color:#036;font-weight:bold">Module</span> }
|
1921
2259
|
|
1922
|
-
|
1923
|
-
<
|
1924
|
-
<
|
2260
|
+
<div class="paragraph" id="Housekeeping">
|
2261
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Housekeeping"/><div class="nav"><a title="Here" href="#Housekeeping"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2262
|
+
<p class="title">Housekeeping</p>
|
2263
|
+
<div class="content"><ul>
|
2264
|
+
<li>
|
2265
|
+
<p>Upgrade to Inochi 2.0.0 for managing this project.</p>
|
2266
|
+
</li>
|
1925
2267
|
|
1926
|
-
<
|
1927
|
-
|
1928
|
-
|
2268
|
+
<li>
|
2269
|
+
<p>Make emulation libraries modify Dfect module instead of Kernel.</p>
|
2270
|
+
</li>
|
1929
2271
|
|
1930
|
-
<
|
1931
|
-
|
1932
|
-
|
1933
|
-
<span style="color:#080;font-weight:bold">end</span>
|
2272
|
+
<li>
|
2273
|
+
<p>Do not pollute the user’s output with our <code class="line"><span style="color:#036;font-weight:bold">Class</span><span style="color:#888">#to_yaml</span></code> workaround.</p>
|
2274
|
+
</li>
|
1934
2275
|
|
1935
|
-
|
2276
|
+
<li>
|
2277
|
+
<p>Remove “Motivation” section from user manual. It was too fanatic!</p>
|
2278
|
+
</li>
|
2279
|
+
</ul></div>
|
1936
2280
|
</div>
|
1937
2281
|
</div>
|
1938
2282
|
</div>
|
1939
|
-
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
<div class="chapter" id="History">
|
1944
|
-
<a name="History"/><div class="nav"><a title="Focus this segment" href="#History"><img alt="Focus this segment" src="84728322" class="icon"/></a> <a title="Focus previous segment" href="#A-sample-unit-test"><img alt="Focus previous segment" src="84727874" class="icon"/></a> <a title="Focus next segment" href="#Version-1-1-0-2009-10-27"><img alt="Focus next segment" src="84727398" class="icon"/></a> <a title="Return to listing" href="#a__toc__History"><img alt="Return to listing" src="84726992" class="icon"/></a></div>
|
1945
|
-
<h1 class="title">
|
1946
|
-
Chapter 4
|
1947
|
-
<br/>
|
1948
|
-
<big>History</big>
|
1949
|
-
</h1>
|
1950
|
-
<div class="content"><div class="tabs"><ul><li><a href="#Version-1-1-0-2009-10-27">Version 1.1.0 (2009-10-27)</a></li><li><a href="#Version-1-0-1-2009-10-07">Version 1.0.1 (2009-10-07)</a></li><li><a href="#Version-1-0-0-2009-05-03">Version 1.0.0 (2009-05-03)</a></li><li><a href="#Version-0-1-0-2009-04-28">Version 0.1.0 (2009-04-28)</a></li><li><a href="#Version-0-0-0-2009-04-13">Version 0.0.0 (2009-04-13)</a></li></ul>
|
2283
|
+
|
1951
2284
|
<div class="section" id="Version-1-1-0-2009-10-27">
|
1952
|
-
<a name="Version-1-1-0-2009-10-27"/><div class="nav"><a title="
|
2285
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Version-1-1-0-2009-10-27"/><div class="nav"><a title="Here" href="#Version-1-1-0-2009-10-27"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Version-2-0-0-2010-03-21"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Version-1-0-1-2009-10-07"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Version-1-1-0-2009-10-27"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
1953
2286
|
<h1 class="title">
|
1954
|
-
4.
|
2287
|
+
<span class="section_number">4.2 </span>Version 1.1.0 (2009-10-27)
|
1955
2288
|
</h1>
|
1956
2289
|
<div class="content"><p>This release adds a new method for emitting status messages and does some internal housekeeping.</p>
|
1957
2290
|
|
1958
|
-
|
2291
|
+
|
1959
2292
|
<div class="paragraph" id="Thank-you">
|
1960
|
-
<
|
2293
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Thank-you"/><div class="nav"><a title="Here" href="#Thank-you"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
1961
2294
|
<p class="title">Thank you</p>
|
1962
2295
|
<div class="content"><ul>
|
1963
2296
|
<li>Iñaki Baz Castillo used Dfect and suggested new features.</li>
|
@@ -1966,18 +2299,18 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
1966
2299
|
|
1967
2300
|
|
1968
2301
|
|
1969
|
-
<div class="paragraph" id="New-features">
|
1970
|
-
<
|
2302
|
+
<div class="paragraph" id="New-features-85749454">
|
2303
|
+
<div style="display: none"><br/><hr/><br/></div><a name="New-features-85749454"/><div class="nav"><a title="Here" href="#New-features-85749454"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
1971
2304
|
<p class="title">New features</p>
|
1972
2305
|
<div class="content"><ul>
|
1973
|
-
<li>Add <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::S()</code> method for <a class="xref" href="#
|
2306
|
+
<li>Add <code class="line"><span style="color:#036;font-weight:bold">Dfect</span>::S()</code> method for <a class="xref" href="#Logging" title="Section 3.2.1.2. "Logging"">adding status messages</a> to the execution report. This feature was <a href='http://github.com/sunaku/dfect/issues/closed#issue/1'>requested by</a> Iñaki Baz Castillo.</li>
|
1974
2307
|
</ul></div>
|
1975
2308
|
</div>
|
1976
2309
|
|
1977
2310
|
|
1978
2311
|
|
1979
|
-
<div class="paragraph" id="Housekeeping">
|
1980
|
-
<
|
2312
|
+
<div class="paragraph" id="Housekeeping-85773044">
|
2313
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Housekeeping-85773044"/><div class="nav"><a title="Here" href="#Housekeeping-85773044"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
1981
2314
|
<p class="title">Housekeeping</p>
|
1982
2315
|
<div class="content"><ul>
|
1983
2316
|
<li>
|
@@ -1985,7 +2318,7 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
1985
2318
|
</li>
|
1986
2319
|
|
1987
2320
|
<li>
|
1988
|
-
<p>Mention <a class="xref" href="#Emulation" title="Section 3.
|
2321
|
+
<p>Mention <a class="xref" href="#Emulation" title="Section 3.1.4">Emulation</a> layers for popular testing libraries.</p>
|
1989
2322
|
</li>
|
1990
2323
|
|
1991
2324
|
<li>
|
@@ -2001,19 +2334,19 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2001
2334
|
</li>
|
2002
2335
|
</ul></div>
|
2003
2336
|
</div>
|
2004
|
-
</div
|
2337
|
+
</div>
|
2005
2338
|
</div>
|
2006
2339
|
|
2007
2340
|
<div class="section" id="Version-1-0-1-2009-10-07">
|
2008
|
-
<a name="Version-1-0-1-2009-10-07"/><div class="nav"><a title="
|
2341
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Version-1-0-1-2009-10-07"/><div class="nav"><a title="Here" href="#Version-1-0-1-2009-10-07"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Version-1-1-0-2009-10-27"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Version-1-0-0-2009-05-03"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Version-1-0-1-2009-10-07"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2009
2342
|
<h1 class="title">
|
2010
|
-
4.
|
2343
|
+
<span class="section_number">4.3 </span>Version 1.0.1 (2009-10-07)
|
2011
2344
|
</h1>
|
2012
2345
|
<div class="content"><p>This release fixes a bug in the Test::Unit emulation library and revises the user manual.</p>
|
2013
2346
|
|
2014
|
-
|
2015
|
-
<div class="paragraph" id="Bug-fixes">
|
2016
|
-
<
|
2347
|
+
|
2348
|
+
<div class="paragraph" id="Bug-fixes-85824340">
|
2349
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Bug-fixes-85824340"/><div class="nav"><a title="Here" href="#Bug-fixes-85824340"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2017
2350
|
<p class="title">Bug fixes</p>
|
2018
2351
|
<div class="content"><ul>
|
2019
2352
|
<li>The parameters for the <code class="line">assert_equal()</code> method in the <tt>dfect/unit</tt> library were in the wrong order.</li>
|
@@ -2022,8 +2355,8 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2022
2355
|
|
2023
2356
|
|
2024
2357
|
|
2025
|
-
<div class="paragraph" id="Housekeeping-
|
2026
|
-
<
|
2358
|
+
<div class="paragraph" id="Housekeeping-85820322">
|
2359
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Housekeeping-85820322"/><div class="nav"><a title="Here" href="#Housekeeping-85820322"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2027
2360
|
<p class="title">Housekeeping</p>
|
2028
2361
|
<div class="content"><ul>
|
2029
2362
|
<li>
|
@@ -2047,23 +2380,23 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2047
2380
|
</li>
|
2048
2381
|
|
2049
2382
|
<li>
|
2050
|
-
<p>Open source is for fun, so <a href='http://loiclemeur.com/english/2009/03/never-criticize-your-competitors.html'>be nice</a
|
2383
|
+
<p>Open source is for fun, so <a href='http://loiclemeur.com/english/2009/03/never-criticize-your-competitors.html'>be nice</a> and speak of “related works” instead of “competitors”.</p>
|
2051
2384
|
</li>
|
2052
2385
|
</ul></div>
|
2053
2386
|
</div>
|
2054
|
-
</div
|
2387
|
+
</div>
|
2055
2388
|
</div>
|
2056
2389
|
|
2057
2390
|
<div class="section" id="Version-1-0-0-2009-05-03">
|
2058
|
-
<a name="Version-1-0-0-2009-05-03"/><div class="nav"><a title="
|
2391
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Version-1-0-0-2009-05-03"/><div class="nav"><a title="Here" href="#Version-1-0-0-2009-05-03"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Version-1-0-1-2009-10-07"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Version-0-1-0-2009-04-28"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Version-1-0-0-2009-05-03"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2059
2392
|
<h1 class="title">
|
2060
|
-
4.
|
2393
|
+
<span class="section_number">4.4 </span>Version 1.0.0 (2009-05-03)
|
2061
2394
|
</h1>
|
2062
2395
|
<div class="content"><p>This release improves default choices, adds emulation layers to mimic other testing libraries, and fixes some bugs.</p>
|
2063
2396
|
|
2064
|
-
|
2065
|
-
<div class="paragraph" id="Incompatible-changes">
|
2066
|
-
<
|
2397
|
+
|
2398
|
+
<div class="paragraph" id="Incompatible-changes-85843282">
|
2399
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Incompatible-changes-85843282"/><div class="nav"><a title="Here" href="#Incompatible-changes-85843282"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2067
2400
|
<p class="title">Incompatible changes</p>
|
2068
2401
|
<div class="content"><ul>
|
2069
2402
|
<li>
|
@@ -2080,8 +2413,8 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2080
2413
|
|
2081
2414
|
|
2082
2415
|
|
2083
|
-
<div class="paragraph" id="New-features-
|
2084
|
-
<
|
2416
|
+
<div class="paragraph" id="New-features-85870708">
|
2417
|
+
<div style="display: none"><br/><hr/><br/></div><a name="New-features-85870708"/><div class="nav"><a title="Here" href="#New-features-85870708"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2085
2418
|
<p class="title">New features</p>
|
2086
2419
|
<div class="content"><ul>
|
2087
2420
|
<li>
|
@@ -2100,8 +2433,8 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2100
2433
|
|
2101
2434
|
|
2102
2435
|
|
2103
|
-
<div class="paragraph" id="Bug-fixes-
|
2104
|
-
<
|
2436
|
+
<div class="paragraph" id="Bug-fixes-85866662">
|
2437
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Bug-fixes-85866662"/><div class="nav"><a title="Here" href="#Bug-fixes-85866662"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2105
2438
|
<p class="title">Bug fixes</p>
|
2106
2439
|
<div class="content"><ul>
|
2107
2440
|
<li>Do not blindly replace <code class="line"><span style="color:#036;font-weight:bold">Class</span><span style="color:#888">#to_yaml</span></code>; it might be fixed someday.</li>
|
@@ -2110,16 +2443,16 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2110
2443
|
|
2111
2444
|
|
2112
2445
|
|
2113
|
-
<div class="paragraph" id="Housekeeping-
|
2114
|
-
<
|
2446
|
+
<div class="paragraph" id="Housekeeping-85894242">
|
2447
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Housekeeping-85894242"/><div class="nav"><a title="Here" href="#Housekeeping-85894242"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2115
2448
|
<p class="title">Housekeeping</p>
|
2116
2449
|
<div class="content"><ul>
|
2117
2450
|
<li>
|
2118
|
-
<p>Add
|
2451
|
+
<p>Add “Motivation” section in user manual to promote interactive debugging.</p>
|
2119
2452
|
</li>
|
2120
2453
|
|
2121
2454
|
<li>
|
2122
|
-
<p>Add brief <a class="xref" href="#History" title="
|
2455
|
+
<p>Add brief <a class="xref" href="#History" title="Part 4">History</a> of this project’s inception.</p>
|
2123
2456
|
</li>
|
2124
2457
|
|
2125
2458
|
<li>
|
@@ -2131,19 +2464,19 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2131
2464
|
</li>
|
2132
2465
|
</ul></div>
|
2133
2466
|
</div>
|
2134
|
-
</div
|
2467
|
+
</div>
|
2135
2468
|
</div>
|
2136
2469
|
|
2137
2470
|
<div class="section" id="Version-0-1-0-2009-04-28">
|
2138
|
-
<a name="Version-0-1-0-2009-04-28"/><div class="nav"><a title="
|
2471
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Version-0-1-0-2009-04-28"/><div class="nav"><a title="Here" href="#Version-0-1-0-2009-04-28"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Version-1-0-0-2009-05-03"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Next" href="#Version-0-0-0-2009-04-13"><img alt="[Next]" src="cid:81897676" class="icon"/></a> <a title="Contents" href="#_contents-Version-0-1-0-2009-04-28"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2139
2472
|
<h1 class="title">
|
2140
|
-
4.
|
2473
|
+
<span class="section_number">4.5 </span>Version 0.1.0 (2009-04-28)
|
2141
2474
|
</h1>
|
2142
2475
|
<div class="content"><p>This release adds new variations to assertion methods, fixes several bugs, and improves test coverage.</p>
|
2143
2476
|
|
2144
|
-
|
2145
|
-
<div class="paragraph" id="Thank-you-
|
2146
|
-
<
|
2477
|
+
|
2478
|
+
<div class="paragraph" id="Thank-you-80236618">
|
2479
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Thank-you-80236618"/><div class="nav"><a title="Here" href="#Thank-you-80236618"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2147
2480
|
<p class="title">Thank you</p>
|
2148
2481
|
<div class="content"><ul>
|
2149
2482
|
<li>François Beausoleil contributed patches for both code <em>and</em> tests! :-)</li>
|
@@ -2152,26 +2485,24 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2152
2485
|
|
2153
2486
|
|
2154
2487
|
|
2155
|
-
<div class="paragraph" id="New-features-
|
2156
|
-
<
|
2488
|
+
<div class="paragraph" id="New-features-80867682">
|
2489
|
+
<div style="display: none"><br/><hr/><br/></div><a name="New-features-80867682"/><div class="nav"><a title="Here" href="#New-features-80867682"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2157
2490
|
<p class="title">New features</p>
|
2158
2491
|
<div class="content"><ul>
|
2159
|
-
<li>
|
2160
|
-
|
2492
|
+
<li>Added <a class="xref" href="#Negation" title="Section 3.1.1. "Negation"">negation (m!)</a> and <a class="xref" href="#Sampling" title="Section 3.1.2. "Sampling"">sampling (m?)</a> variations to <a class="xref" href="#Assertions" title="Section 3.1. "Assertions"">assertion methods</a>.</li>
|
2493
|
+
</ul>
|
2161
2494
|
|
2162
2495
|
<p>These new methods implement assertion functionality missing so far (previously we could not assert that a given exception was NOT thrown) and thereby allow us to fully test Dfect using itself.</p>
|
2163
|
-
</li>
|
2164
2496
|
|
2165
|
-
<
|
2166
|
-
|
2167
|
-
|
2168
|
-
</ul></div>
|
2497
|
+
<pre>* Added documentation on <a class="xref" href="#Insulation" title="Section 3.2.3. "Insulation"">how to insulate tests</a></pre>
|
2498
|
+
|
2499
|
+
<p>from the global Ruby namespace.</p></div>
|
2169
2500
|
</div>
|
2170
2501
|
|
2171
2502
|
|
2172
2503
|
|
2173
|
-
<div class="paragraph" id="Bug-fixes-
|
2174
|
-
<
|
2504
|
+
<div class="paragraph" id="Bug-fixes-84138754">
|
2505
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Bug-fixes-84138754"/><div class="nav"><a title="Here" href="#Bug-fixes-84138754"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2175
2506
|
<p class="title">Bug fixes</p>
|
2176
2507
|
<div class="content"><ul>
|
2177
2508
|
<li>
|
@@ -2198,22 +2529,22 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2198
2529
|
|
2199
2530
|
|
2200
2531
|
|
2201
|
-
<div class="paragraph" id="Housekeeping-
|
2202
|
-
<
|
2532
|
+
<div class="paragraph" id="Housekeeping-84457184">
|
2533
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Housekeeping-84457184"/><div class="nav"><a title="Here" href="#Housekeeping-84457184"><img alt="[Here]" src="cid:81898502" class="icon"/></a> </div>
|
2203
2534
|
<p class="title">Housekeeping</p>
|
2204
2535
|
<div class="content"><ul>
|
2205
2536
|
<li>Filled the big holes in test coverage. Everything except the runtime debugging logic is now covered by the unit tests.</li>
|
2206
2537
|
</ul></div>
|
2207
2538
|
</div>
|
2208
|
-
</div
|
2539
|
+
</div>
|
2209
2540
|
</div>
|
2210
2541
|
|
2211
2542
|
<div class="section" id="Version-0-0-0-2009-04-13">
|
2212
|
-
<a name="Version-0-0-0-2009-04-13"/><div class="nav"><a title="
|
2543
|
+
<div style="display: none"><br/><hr/><br/></div><a name="Version-0-0-0-2009-04-13"/><div class="nav"><a title="Here" href="#Version-0-0-0-2009-04-13"><img alt="[Here]" src="cid:81898502" class="icon"/></a> <a title="Previous" href="#Version-0-1-0-2009-04-28"><img alt="[Previous]" src="cid:81898012" class="icon"/></a> <a title="Contents" href="#_contents-Version-0-0-0-2009-04-13"><img alt="[Contents]" src="cid:81897116" class="icon"/></a></div>
|
2213
2544
|
<h1 class="title">
|
2214
|
-
4.
|
2545
|
+
<span class="section_number">4.6 </span>Version 0.0.0 (2009-04-13)
|
2215
2546
|
</h1>
|
2216
|
-
<div class="content"><p>For the longest time, I took
|
2547
|
+
<div class="content"><p>For the longest time, I took Test::Unit and <a href='http://rspec.info'>RSpec</a> for granted. They were the epitomy of modern Ruby practice; the insurmountable status quo; immortalized in books, conferences, and blogs alike.</p>
|
2217
2548
|
|
2218
2549
|
<p>Why would <em>anyone</em> think of using anything remotely different, let alone be foolish enough to write an alternative testing library when these are clearly <em>good enough</em>?</p>
|
2219
2550
|
|
@@ -2231,19 +2562,18 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2231
2562
|
|
2232
2563
|
<p>Empowered by this revelation and inspired by <a href='http://www.ruby-forum.com/topic/183354#801895'>Sean O’Halpin’s musing</a> on alternative names for assertion methods, I rose to challenge the status quo.</p>
|
2233
2564
|
|
2234
|
-
<p>And so I present to you the first public release of Dfect
|
2565
|
+
<p>And so I present to you the first public release of “Dfect”.</p></div>
|
2235
2566
|
</div>
|
2236
2567
|
</div></div>
|
2237
2568
|
</div>
|
2238
2569
|
|
2239
|
-
|
2240
2570
|
</div>
|
2241
2571
|
|
2242
2572
|
|
2243
2573
|
<div style="display: none"><br/><hr/><br/></div>
|
2244
2574
|
|
2245
|
-
<div id="
|
2246
|
-
<p>This document was generated by <a href="http://snk.tuxfamily.org/lib/erbook/">ERBook 9.
|
2575
|
+
<div id="_about">
|
2576
|
+
<p>This document was generated by <a href="http://snk.tuxfamily.org/lib/erbook/">ERBook 9.2.1 (2009-11-18)</a> on <b>Sun Mar 21 16:21:47 2010</b> using the following resources.</p>
|
2247
2577
|
|
2248
2578
|
<table border="1">
|
2249
2579
|
<thead>
|
@@ -2256,17 +2586,18 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2256
2586
|
<tbody>
|
2257
2587
|
<tr>
|
2258
2588
|
<td>
|
2259
|
-
<img alt="here_frag" src="
|
2260
|
-
<img alt="
|
2261
|
-
<img alt="
|
2262
|
-
<img alt="
|
2263
|
-
<img alt="
|
2264
|
-
<img alt="
|
2265
|
-
<img alt="
|
2266
|
-
<img alt="
|
2267
|
-
<img alt="
|
2268
|
-
<img alt="
|
2269
|
-
<img alt="
|
2589
|
+
<img alt="here_frag" src="cid:82357212" class="icon"/>
|
2590
|
+
<img alt="command" src="cid:82356834" class="icon"/>
|
2591
|
+
<img alt="important" src="cid:82356428" class="icon"/>
|
2592
|
+
<img alt="warning" src="cid:82356008" class="icon"/>
|
2593
|
+
<img alt="caution" src="cid:82355644" class="icon"/>
|
2594
|
+
<img alt="note" src="cid:81900308" class="icon"/>
|
2595
|
+
<img alt="tip" src="cid:81899636" class="icon"/>
|
2596
|
+
<img alt="quote" src="cid:81899006" class="icon"/>
|
2597
|
+
<img alt="nav_here" src="cid:81898502" class="icon"/>
|
2598
|
+
<img alt="nav_prev" src="cid:81898012" class="icon"/>
|
2599
|
+
<img alt="nav_next" src="cid:81897676" class="icon"/>
|
2600
|
+
<img alt="nav_list" src="cid:81897116" class="icon"/>
|
2270
2601
|
</td>
|
2271
2602
|
<td>
|
2272
2603
|
<a href="http://tango.freedesktop.org/Tango_Icon_Library">Tango Icon Theme</a>
|
@@ -2280,7 +2611,7 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2280
2611
|
|
2281
2612
|
<tr>
|
2282
2613
|
<td>
|
2283
|
-
<img alt="hyperlink" src="
|
2614
|
+
<img alt="hyperlink" src="cid:82357576" class="icon"/>
|
2284
2615
|
</td>
|
2285
2616
|
<td>
|
2286
2617
|
<a href="http://www.mediawiki.org/skins-1.5/monobook/external.png">MediaWiki Monobook Skin</a>
|
@@ -2296,12 +2627,12 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2296
2627
|
|
2297
2628
|
<p class="validations">
|
2298
2629
|
<a href="http://validator.w3.org/check?uri=referer"><img
|
2299
|
-
src="
|
2630
|
+
src="cid:81896640"
|
2300
2631
|
alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a>
|
2301
2632
|
|
2302
2633
|
<a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3"><img
|
2303
|
-
src="
|
2304
|
-
alt="Valid CSS!" height="31" width="88" /></a>
|
2634
|
+
src="cid:81896052"
|
2635
|
+
alt="Valid CSS 3!" height="31" width="88" /></a>
|
2305
2636
|
</p>
|
2306
2637
|
</div>
|
2307
2638
|
</div>
|
@@ -2309,7 +2640,7 @@ require <span style="background-color:#fff0f0;color:#D20"><span style="color:#71
|
|
2309
2640
|
|
2310
2641
|
|
2311
2642
|
|
2312
|
-
<div id="
|
2643
|
+
<div id="_footer">
|
2313
2644
|
|
2314
2645
|
|
2315
2646
|
|