fit 1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. data/README.txt +203 -0
  2. data/Rakefile +111 -0
  3. data/bin/FitServer.rb +6 -0
  4. data/bin/fit +10 -0
  5. data/bin/fit.cgi +36 -0
  6. data/doc/examples/AllCombinations.html +55 -0
  7. data/doc/examples/AllFiles.html +60 -0
  8. data/doc/examples/AllPairs/function/cosine.html +57 -0
  9. data/doc/examples/AllPairs/function/sine.html +57 -0
  10. data/doc/examples/AllPairs/magnitude/180+30.html +45 -0
  11. data/doc/examples/AllPairs/magnitude/30.html +33 -0
  12. data/doc/examples/AllPairs/magnitude/360+30.html +45 -0
  13. data/doc/examples/AllPairs/magnitude/90-30.html +45 -0
  14. data/doc/examples/AllPairs/sign/change-sign.html +27 -0
  15. data/doc/examples/AllPairs/sign/multiply.html +31 -0
  16. data/doc/examples/AllPairs/sign/no-change.html +23 -0
  17. data/doc/examples/AllPairs.html +51 -0
  18. data/doc/examples/BinaryChop.html +89 -0
  19. data/doc/examples/CalculatorExample.html +108 -0
  20. data/doc/examples/ColumnIndex.html +43 -0
  21. data/doc/examples/ExampleTests.html +43 -0
  22. data/doc/examples/FitAcceptanceTests.html +53 -0
  23. data/doc/examples/GeoCoordinate.html +87 -0
  24. data/doc/examples/MusicExample.html +143 -0
  25. data/doc/examples/MusicExampleWithErrors.html +128 -0
  26. data/doc/examples/NetworkExample.html +47 -0
  27. data/doc/examples/WebPageExample.html +92 -0
  28. data/doc/examples/arithmetic.html +211 -0
  29. data/doc/examples/files/hp35bk.jpg +0 -0
  30. data/doc/examples/logo.gif +0 -0
  31. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.FixtureParameters.html +81 -0
  32. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.GracefulFixtureNames.html +87 -0
  33. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.GracefulMemberNames.html +73 -0
  34. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.ImportFixture.html +61 -0
  35. data/doc/fitnesse/FitNesse.RubY.AcceptanceTests.WaysToSpecifyaFixtureNamespace.html +81 -0
  36. data/doc/spec/annotation.html +3833 -0
  37. data/doc/spec/extensions.html +302 -0
  38. data/doc/spec/fixtures.html +5181 -0
  39. data/doc/spec/index.html +947 -0
  40. data/doc/spec/parse.html +3094 -0
  41. data/lib/eg/all_combinations.rb +44 -0
  42. data/lib/eg/all_files.rb +94 -0
  43. data/lib/eg/all_pairs.rb +172 -0
  44. data/lib/eg/arithmetic_column_fixture.rb +35 -0
  45. data/lib/eg/arithmetic_fixture.rb +29 -0
  46. data/lib/eg/binary_chop.rb +100 -0
  47. data/lib/eg/calculator.rb +69 -0
  48. data/lib/eg/column_index.rb +85 -0
  49. data/lib/eg/division.rb +13 -0
  50. data/lib/eg/echo_args_fixture.rb +9 -0
  51. data/lib/eg/example_tests.rb +84 -0
  52. data/lib/eg/music/Music.txt +38 -0
  53. data/lib/eg/music/browser.rb +60 -0
  54. data/lib/eg/music/display.rb +24 -0
  55. data/lib/eg/music/music.rb +67 -0
  56. data/lib/eg/music/music_library.rb +70 -0
  57. data/lib/eg/music/music_player.rb +77 -0
  58. data/lib/eg/music/realtime.rb +39 -0
  59. data/lib/eg/music/simulator.rb +81 -0
  60. data/lib/eg/nested/bob.rb +12 -0
  61. data/lib/eg/nested/bob_the_builder_fixture.rb +11 -0
  62. data/lib/eg/net/simulator.rb +69 -0
  63. data/lib/eg/page.rb +91 -0
  64. data/lib/eg/sqrt.rb +19 -0
  65. data/lib/fat/annotation_fixture.rb +83 -0
  66. data/lib/fat/color.rb +45 -0
  67. data/lib/fat/divide.rb +13 -0
  68. data/lib/fat/document_parse_fixture.rb +67 -0
  69. data/lib/fat/equals.rb +59 -0
  70. data/lib/fat/fixture_name_fixture.rb +67 -0
  71. data/lib/fat/html_to_text_fixture.rb +20 -0
  72. data/lib/fat/money.rb +18 -0
  73. data/lib/fat/output_fixture.rb +32 -0
  74. data/lib/fat/parse_fixture.rb +92 -0
  75. data/lib/fat/reference_fixture.rb +31 -0
  76. data/lib/fat/standard_annotation_fixture.rb +58 -0
  77. data/lib/fat/string_writer.rb +12 -0
  78. data/lib/fat/table.rb +23 -0
  79. data/lib/fat/table_parse_fixture.rb +33 -0
  80. data/lib/fat/text_to_html_fixture.rb +21 -0
  81. data/lib/fit/action_fixture.rb +65 -0
  82. data/lib/fit/column_fixture.rb +104 -0
  83. data/lib/fit/file_runner.rb +80 -0
  84. data/lib/fit/fit_protocol.rb +62 -0
  85. data/lib/fit/fit_server.rb +173 -0
  86. data/lib/fit/fixture.rb +309 -0
  87. data/lib/fit/fixture_loader.rb +75 -0
  88. data/lib/fit/import_fixture.rb +9 -0
  89. data/lib/fit/parse.rb +206 -0
  90. data/lib/fit/primitive_fixture.rb +52 -0
  91. data/lib/fit/row_fixture.rb +188 -0
  92. data/lib/fit/scientific_double.rb +70 -0
  93. data/lib/fit/summary.rb +46 -0
  94. data/lib/fit/timed_action_fixture.rb +35 -0
  95. data/lib/fit/type_adapter.rb +95 -0
  96. data/lib/fit/wiki_runner.rb +15 -0
  97. data/lib/fittask.rb +184 -0
  98. data/test/all_tests.rb +13 -0
  99. data/test/file_runner_test.rb +52 -0
  100. data/test/fit_server_test.rb +214 -0
  101. data/test/fixture_loader_test.rb +71 -0
  102. data/test/fixture_test.rb +41 -0
  103. data/test/fixtures/fail_fixture.rb +9 -0
  104. data/test/fixtures/pass_fixture.rb +9 -0
  105. data/test/framework_test.rb +51 -0
  106. data/test/parse_test.rb +101 -0
  107. data/test/row_fixture_test.rb +44 -0
  108. data/test/scientific_double_test.rb +35 -0
  109. data/test/type_adapter_test.rb +120 -0
  110. metadata +165 -0
@@ -0,0 +1,87 @@
1
+ <html>
2
+ <head>
3
+ <title>Wiki: Geo Coordinate</title>
4
+ <head>
5
+ <body bgcolor=#FFFFFF link=#d06040 vlink=#806040>
6
+ <h1>Geo Coordinate</h1>
7
+ <wiki>This example illustrates the framework's accomodation of <a href=wiki.cgi?WholeValue>WholeValue</a>(s). Geocoordinates were first introduced to Fit in the incomplete <a href=wiki.cgi?NetworkExample>NetworkExample</a>.
8
+ <p>A geocoordinate is a coordinate used in geography (geo = geography). A coordinate is a pair of ordinates (co = pair). An ordinate is a measure of position (ordinate = ordinal number). Informally, a geocoordinate measures a position in the world.
9
+ <p>A geocoordinate is the point where a vector from the center of the earth (for example) intersects the surface. That is, for a given surface, a two dimensional vector defines a three dimensional point in space.
10
+ <p><UL>
11
+ <li> <a href="//hyperphysics.phy-astr.gsu.edu/hbase/sphc.html">http://hyperphysics.phy- ... /hbase/sphc.html</a>
12
+ <p></UL>
13
+ Here we use the matematical notion of theta and phi to define a point and then give its cooresponding <a href=wiki.cgi?GeoCoordinate>GeoCoordinate</a> as lattitude and longitude north or south of the equator (phi=90) and east or west of the prime merridian (theta=0).
14
+ <p>In this test we will find it convenient to specify ideal points (using degrees) and find their geocoordinates. Note, theta and phi are concepts used for writing this test, not necessarily properties of a geocoordinate.
15
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
16
+ <tr><td ColSpan=3> eg.<a href=wiki.cgi?GeoCoordinateExample>GeoCoordinateExample</a> </td></tr>
17
+ <tr><td> theta </td><td> phi </td><td> coord() </td></tr>
18
+ <tr><td> 10 </td><td> 60 </td><td> 10 e 30 n </td></tr>
19
+ <tr><td> 350 </td><td> 120 </td><td> 10 w 30 s </td></tr>
20
+ </table>
21
+ <p>We can also specify a <a href=wiki.cgi?GeoCoordinate>GeoCoordinate</a> and find the vector that represents it. When we do so we will expect 0 &lt;= theta &lt; 360 and 0 &lt;= phi &lt;=180, though that is just a convention of this test. We assume theta and phi are checked to the precision implied by the number of significant digits written.
22
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
23
+ <tr><td ColSpan=3> eg.<a href=wiki.cgi?GeoCoordinateExample>GeoCoordinateExample</a> </td></tr>
24
+ <tr><td> coord </td><td> theta() </td><td> phi() </td></tr>
25
+ <tr><td> 10 e 30 n </td><td> 10 </td><td> 60 </td></tr>
26
+ <tr><td> 10 w 30 s </td><td> 350 </td><td> 120 </td></tr>
27
+ </table>
28
+ <p>We accept some variety of notation. In general, a latitude or longitude can be specified with one, two or three numbers. These are consistently prefixed or sufixed with n, s, e, or w, possibly capitalized, spelt out, or omitted when signed numbers are assumed. Spaces and other punctuation is ignored except that it serves as a separator.
29
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
30
+ <tr><td ColSpan=3> eg.<a href=wiki.cgi?GeoCoordinateExample>GeoCoordinateExample</a> </td></tr>
31
+ <tr><td> coord </td><td> theta() </td><td> phi() </td></tr>
32
+ <tr><td> 10 30 </td><td> 10 </td><td> 60 </td></tr>
33
+ <tr><td> -10 -30 </td><td> 350 </td><td> 70 </td></tr>
34
+ <tr><td> 10 east 30 north </td><td> 10 </td><td> 60 </td></tr>
35
+ <tr><td> 10.5 e 30.5 n </td><td> 10.5 </td><td> 59.5 </td></tr>
36
+ <tr><td> 10.5e, 30.5n </td><td> 10.5 </td><td> 59.5 </td></tr>
37
+ <tr><td> 10.5e30n </td><td> 10.5 </td><td> 60 </td></tr>
38
+ <tr><td> 10.5 E 30.5 N </td><td> 10.5 </td><td> 59.5 </td></tr>
39
+ <tr><td> e 10.5 n 30.5 </td><td> 10.5 </td><td> 60.5 </td></tr>
40
+ <tr><td> 10 30 e 30 30 n </td><td> 10.5 </td><td> 59.5 </td></tr>
41
+ <tr><td> 10:30 e 30:30 n </td><td> 10.5 </td><td> 59.5 </td></tr>
42
+ <tr><td> 10 30 00 e 30 30 00 n </td><td> 10.5 </td><td> 59.5 </td></tr>
43
+ <tr><td> 10 30.5 e 30 30.5 n </td><td> 10.508333 </td><td> 49.491666 </td></tr>
44
+ <tr><td> 10� 30' 30" e 30� 30' 30" n </td><td> 10.508333 </td><td> 49.491666 </td></tr>
45
+ </table>
46
+ <p>We don't expect to encounter a lat or lon like the following so we don't specify behavior for the following cases other than to say: all possible inputs produce either a well formed geocoordinate, answer null or throw an exception.
47
+ <p><p><UL>
48
+ <li> -100 w (for east?)
49
+ <li> 100 -5 (for 5 min west of 100 east?)
50
+ <p></UL>
51
+ We depend on geocoordinates being equal when they specifiy the same point, even when they aren't specified the same way. Also, points that are very close are considered equal. We defined the boundary between very close (equal) and not as close (unequal) to be somewhere between 1/2 and 1/10 of a second of arc, measured independently in both latitude and longitude. This measure of closeness is overly stringent at the poles which is one more thing that is wrong there besides being very cold.
52
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
53
+ <tr><td ColSpan=3> eg.<a href=wiki.cgi?GeoCoordinateExample>GeoCoordinateExample</a> </td></tr>
54
+ <tr><td> coord </td><td> coord2 </td><td> equal() </td></tr>
55
+ <tr><td> 45.5 n 122.5 w </td><td> N 45 30 00, W 122 30 00 </td><td> true </td></tr>
56
+ <tr><td> E 10 10 10, S 10 10 10.1 </td><td> E 10 10 10, S 10 10 10.9 </td><td> false </td></tr>
57
+ <tr><td> E 10 10 10, S 10 10 10.11 </td><td> E 10 10 10, S 10 10 10.19 </td><td> true </td></tr>
58
+ <tr><td> E 10 10 10, S 10 10 10.111 </td><td> E 10 10 10, S 10 10 10.119 </td><td> true </td></tr>
59
+ </table>
60
+ <p><p>A classing example of using geocoordinates is that of finding the great-circle distance between places on the earth. This, of course, requires factoring in the three-dimensional nature of the path, the radius of the earth, and for good accuracy, the variation in radius due to the equatorial bulging (oblateness) of the earth's average surface. Here we compare distances (miles) computed using the WGS84 conventions to those assuming a spherical earth.
61
+ <p><p><table BORDER CELLSPACING=0 CELLPADDING=3>
62
+ <tr><td ColSpan=5> eg.<a href=wiki.cgi?GeoCoordinateExample>GeoCoordinateExample</a> </td></tr>
63
+ <tr><td> coord </td><td> coord2 </td><td> wgs84() </td><td> sphere() </td><td> route </td></tr>
64
+ <tr><td> 45�35'19"N 122�35'51"W </td><td> 22�18'32"N 113�54'53"E </td><td> 6571.07 </td><td> 6555.10 </td><td> portland to hong kong </td></tr>
65
+ <tr><td> 47�26'56"N 122�18'34"W </td><td> 33�56'46"S 151�10'38"E </td><td> 7739.45 </td><td> 7744.53 </td><td> seattle to sydney </td></tr>
66
+ <tr><td> 61�10'28"N 149�59'47"W </td><td> 51�28'39"N 00�27'41"W </td><td> 4488.67 </td><td> 4470.68 </td><td> ancorage to london </td></tr>
67
+ </table>
68
+ <p>These are web resources that were used to produce some of these expected values.
69
+ <p><UL>
70
+ <li> <a href="//williams.best.vwh.net/gccalc.htm">http://williams.best.vwh.net/gccalc.htm</a>
71
+ <li> <a href="//gc.kls2.com/">http://gc.kls2.com/</a>
72
+ </UL>
73
+ <p>
74
+ Hint: A reasonable implementation might separate geocoordinates from the surface models that interpret them as points in space. There are actually quite a number of the latter as it turns out. Real topographic data could serve as a model also.
75
+ <p></p>
76
+
77
+ <table border="1" cellspacing="0" cellpadding="3">
78
+ <tr><td>fit.Summary</td></tr>
79
+ </table>
80
+ <p></p>
81
+
82
+ </wiki>
83
+ <hr>
84
+ Last edited July 12, 2005
85
+ </body>
86
+ </html>
87
+
@@ -0,0 +1,143 @@
1
+ <html>
2
+ <head>
3
+ <title>Wiki: Music Example</title>
4
+ <head>
5
+ <body bgcolor=#FFFFFF link=#d06040 vlink=#806040>
6
+ <h1>Music Example</h1>
7
+ <wiki>In this example we describe a music player as if we were operating it. We will see two kinds of tables in use, action and row. The action tables list things actions to be performed, step-by-step, one row at a time. Some actions will involve searching for music. We will check to be sure we've found the right music using a second kind of table, a row table. In the row table we will simply list each song, one per row, with columns showing different attributes of each song. We'll use these fixtures.
8
+ <p>We'll write the remainder of this page as if it were describing stories for the music library/player. We'll use italics when we want to point out features of the framework. You might as well run the example now before you continue reading.
9
+ <p><UL>
10
+ <li> <a href="run.cgi">http:run.cgi</a>
11
+ <p></UL>
12
+ This is our most realistic example short of the SampleApplications. See the MusicExampleObjectModel to understand all of the objects in play here.
13
+ <p><hr>
14
+ <p><strong>Browsing Music</strong>
15
+ <p>The music browser starts up looking at the whole library of songs. We specify the library (an advanced feature) so that we know what we are talking about in this document.
16
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
17
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
18
+ <tr><td> start </td><td> eg.music.Browser </td><td>&nbsp;</td></tr>
19
+ <tr><td> enter </td><td> library </td><td> src/eg/music/Music.txt </td></tr>
20
+ <tr><td> check </td><td> total songs </td><td> 37 </td></tr>
21
+ </table>
22
+ <p><em>This is a the file that library reads. It is tab separated text. Try downloading it and looking at it with a spreadsheet. <a href="Release/Source/eg/music/Music.txt">http:Release/Source/eg/music/Music.txt</a></em>
23
+ <p>We can pick songs and see details of our selection as we go.
24
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
25
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
26
+ <tr><td> enter </td><td> select </td><td> 1 </td></tr>
27
+ <tr><td> check </td><td> title </td><td> Akila </td></tr>
28
+ <tr><td> check </td><td> artist </td><td> Toure Kunda </td></tr>
29
+ <tr><td> enter </td><td> select </td><td> 2 </td></tr>
30
+ <tr><td> check </td><td> title </td><td> American Tango </td></tr>
31
+ <tr><td> check </td><td> artist </td><td> Weather Report </td></tr>
32
+ <tr><td> check </td><td> album </td><td> Mysterious Traveller </td></tr>
33
+ <tr><td> check </td><td> year </td><td> 1974 </td></tr>
34
+ <tr><td> check </td><td> time </td><td> 3.70 </td></tr>
35
+ <tr><td> check </td><td> track </td><td> 2 of 7 </td></tr>
36
+ </table>
37
+ <p><em>ActionFixture interprets the words in the first column. The actions operate on fields and buttons on the </em>Browser<em> screen we started in the first table. The Browser (or what ever other Fixtures we start) interprets the names in the second column. Each name maps to a method of the Browser. The third column provides data that are pass as arguments to Browser methods or compared with Browser method results. See MusicExampleWithErrors to see how errors are reported.</em>
38
+ <p><hr>
39
+ <p><strong>Playing Music</strong>
40
+ <p>Once we've picked a song, we can play it. We can continue operating the Brower while music is playing. Since this sequence is long, we'll explain what we are doing in an unused column.
41
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
42
+ <tr><td ColSpan=4> eg.music.Realtime </td></tr>
43
+ <tr><td> press </td><td> play </td><td>&nbsp;</td><td> play this song </td></tr>
44
+ <tr><td> check </td><td> status </td><td> loading </td><td>&nbsp;</td></tr>
45
+ <tr><td> pause </td><td> 2 </td><td>&nbsp;</td><td>&nbsp;</td></tr>
46
+ <tr><td> check </td><td> status </td><td> loading </td><td> watch it load </td></tr>
47
+ <tr><td> pause </td><td> 2 </td><td>&nbsp;</td><td>&nbsp;</td></tr>
48
+ <tr><td> check </td><td> status </td><td> playing </td><td>&nbsp;</td></tr>
49
+ <tr><td> check </td><td> playing </td><td> American Tango </td><td>&nbsp;</td></tr>
50
+ <tr><td> check </td><td> time </td><td> 3.70 </td><td>&nbsp;</td></tr>
51
+ <tr><td> press </td><td> pause </td><td>&nbsp;</td><td> make it stop </td></tr>
52
+ <tr><td> check </td><td> status </td><td> pause </td><td>&nbsp;</td></tr>
53
+ <tr><td> check </td><td> remaining </td><td> 3.66 </td><td>&nbsp;</td></tr>
54
+ <tr><td> pause </td><td> 60 </td><td>&nbsp;</td><td>&nbsp;</td></tr>
55
+ <tr><td> check </td><td> remaining </td><td> 3.66 </td><td>&nbsp;</td></tr>
56
+ <tr><td> press </td><td> play </td><td>&nbsp;</td><td> make it go </td></tr>
57
+ <tr><td> check </td><td> status </td><td> playing </td><td>&nbsp;</td></tr>
58
+ <tr><td> pause </td><td> 60 </td><td>&nbsp;</td><td>&nbsp;</td></tr>
59
+ <tr><td> check </td><td> remaining </td><td> 2.66 </td><td>&nbsp;</td></tr>
60
+ <tr><td> await </td><td> play complete </td><td>&nbsp;</td><td> enjoy the music </td></tr>
61
+ <tr><td> check </td><td> status </td><td> ready </td><td>&nbsp;</td></tr>
62
+ <tr><td> enter </td><td> select </td><td> 4 </td><td> try another </td></tr>
63
+ <tr><td> press </td><td> play </td><td>&nbsp;</td><td>&nbsp;</td></tr>
64
+ <tr><td> pause </td><td> 1 </td><td>&nbsp;</td><td>&nbsp;</td></tr>
65
+ <tr><td> fail </td><td> load jam </td><td>&nbsp;</td><td> uh oh </td></tr>
66
+ <tr><td> check </td><td> message </td><td> load jamed </td><td>&nbsp;</td></tr>
67
+ <tr><td> press </td><td> ok </td><td>&nbsp;</td><td> dispatch the notifier </td></tr>
68
+ <tr><td> check </td><td> status </td><td> ready </td><td>&nbsp;</td></tr>
69
+ </table>
70
+ <p><p><em>This table is interpreted by Realtime, a Fixture that adds actions having to do with realtime operation of the music player. This fixture calls on a simulator to keep track of system events. We do so here only because the application we are testing isn't a real music player. Our toy application cooperates with the simulator to keep track of time. A real player would do things that take real time and it would use the computer's realtime clock to keep track of time. We could still use a fixture with actions like </em>pause<em> and </em>await<em> but there wouldn't need to be a simulator too.</em>
71
+ <p><hr>
72
+ <p><strong>Searching for Music</strong>
73
+ <p>There are buttons on the browser to find more songs like the one we have picked.
74
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
75
+ <tr><td ColSpan=4> eg.music.Realtime </td></tr>
76
+ <tr><td> enter </td><td> select </td><td> 2 </td><td> pick an album </td></tr>
77
+ <tr><td> press </td><td> same album </td><td>&nbsp;</td><td> find more like it </td></tr>
78
+ <tr><td> check </td><td> status </td><td> searching </td><td>&nbsp;</td></tr>
79
+ <tr><td> await </td><td> search complete </td><td>&nbsp;</td><td>&nbsp;</td></tr>
80
+ <tr><td> check </td><td> status </td><td> ready </td><td>&nbsp;</td></tr>
81
+ <tr><td> check </td><td> selected songs </td><td> 2 </td><td>&nbsp;</td></tr>
82
+ </table>
83
+ <p><em>Our searches take a few seconds to complete. Eventually we will want to try mashing buttons faster than the computer can respond. For now we will be polite and </em>await<em> completion of our searches.</em>
84
+ <p>The selected songs are displayed in a table.
85
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
86
+ <tr><td ColSpan=6> eg.music.Display </td></tr>
87
+ <tr><td> title </td><td> artist </td><td> album </td><td> year </td><td> time() </td><td> track() </td></tr>
88
+ <tr><td> Scarlet Woman </td><td> Weather Report </td><td> Mysterious Traveller </td><td> 1974 </td><td> 5.72 </td><td> 6 of 7 </td></tr>
89
+ <tr><td> American Tango </td><td> Weather Report </td><td> Mysterious Traveller </td><td> 1974 </td><td>3.70 </td><td> 2 of 7 </td></tr>
90
+ </table>
91
+ <p><em>Here we use Display (a RowFixture) to directly examine the Music object found by our search. Things like </em>artist<em> and </em>track()<em> are fields and methods of the domain objects.</em>
92
+ <p>We can find songs related in different ways. Each new way produces a (possibly) different list of songs. <em>Show all</em> restores the display to the initial conditions.
93
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
94
+ <tr><td ColSpan=4> eg.music.Realtime </td></tr>
95
+ <tr><td> press </td><td> show all </td><td>&nbsp;</td><td> recall all the songs </td></tr>
96
+ <tr><td> await </td><td> search complete </td><td>&nbsp;</td><td>&nbsp;</td></tr>
97
+ <tr><td> check </td><td> selected songs </td><td> 37 </td><td>&nbsp;</td></tr>
98
+ <tr><td> enter </td><td> select </td><td> 3 </td><td> pick a James Taylor song</td></tr>
99
+ <tr><td> check </td><td> artist </td><td> James Taylor </td><td>&nbsp;</td></tr>
100
+ <tr><td> press </td><td> same artist </td><td>&nbsp;</td><td> find more by him </td></tr>
101
+ <tr><td> await </td><td> search complete </td><td>&nbsp;</td><td>&nbsp;</td></tr>
102
+ <tr><td> check </td><td> selected songs </td><td> 5 </td><td>&nbsp;</td></tr>
103
+ </table>
104
+ <p>Yielding the display:
105
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
106
+ <tr><td ColSpan=6> eg.music.Display </td></tr>
107
+ <tr><td> title </td><td> artist </td><td> album </td><td> year </td><td> time() </td><td> track() </td></tr>
108
+ <tr><td> Handy Man </td><td> James Taylor </td><td> JT </td><td> 1977 </td><td> 3.30 </td><td> 7 of 12 </td></tr>
109
+ <tr><td> Sailing To Philadelphia </td><td> James Taylor </td><td> October Rose </td><td> 2001 </td><td> 5.47 </td><td> 3 of 3 </td></tr>
110
+ <tr><td> Ananas </td><td> James Taylor </td><td> Hourglass </td><td> 1997 </td><td> 5.73 </td><td> 5 of 13 </td></tr>
111
+ <tr><td> Another Grey Morning </td><td> James Taylor </td><td> JT </td><td> 1977 </td><td> 2.73 </td><td> 4 of 12 </td></tr>
112
+ <tr><td> Copperline </td><td> James Taylor </td><td> New Moon Shine </td><td> 1991 </td><td> 4.37</td><td> 1 of 12 </td></tr>
113
+ </table>
114
+ <p><em>Domain objects typically have lots more fields and methods than we can conveniently look at in a single table. We compose a table specific to our needs by choosing column headings of interest. Here is another look at the results of the previous search.</em>
115
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
116
+ <tr><td ColSpan=6> eg.music.Display </td></tr>
117
+ <tr><td> title </td><td> album </td><td> genre </td><td> size </td><td> date </td></tr>
118
+ <tr><td> Another Grey Morning </td><td> JT </td><td> Pop </td><td> 3284199 </td><td> 9/7/02 11:32 PM </td></tr>
119
+ <tr><td> Ananas </td><td> Hourglass </td><td> Pop </td><td> 6897450 </td><td> 9/7/02 11:47 PM </td></tr>
120
+ <tr><td> Copperline </td><td> New Moon Shine </td><td> Pop </td><td> 5248087 </td><td> 9/7/02 9:52 PM </td></tr>
121
+ <tr><td> Handy Man </td><td> JT </td><td> Pop </td><td> 3976956 </td><td> 9/7/02 11:36 PM </td></tr>
122
+ <tr><td> Sailing To Philadelphia </td><td> October Rose </td><td> Pop </td><td> 6581911 </td><td> 9/7/02 10:45 PM </td></tr>
123
+ </table>
124
+ <p><em>Notice that the songs in the two tables are not in the same order. That is because we didn't type the tables in the same order, and the order we type is preserved. RowFixture(s) use the left hand columns to line up the search results with the table values. Check out MusicExampleWithErrors to see how this works when the rows don't match up.</em>
125
+ <p><em>The kaffe jvm/library has trouble with date formatting so you may see errors when running this from wiki.</em>
126
+ <p><em>This completes the MusicExample.</em>
127
+ <p><hr>
128
+ <p>We've run quite a few test. We'll call up one more Fixture that will add a summary to the end of our document.
129
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
130
+ <tr><td ColSpan=2> fit.Summary </td></tr>
131
+ </table>
132
+ <p><hr>
133
+ <p>This is our most complete standard example. You can run it against more than one fit implementation by choosing any one of these specialized RunScript.
134
+ <p><UL>
135
+ <li> <a href="files/LispPlatform/runScheme.cgi">http:files/LispPlatform/runScheme.cgi</a>
136
+ <li> <a href="files/LispPlatform/runLisp.cgi">http:files/LispPlatform/runLisp.cgi</a>
137
+ <p></UL>
138
+ (Caution: these scripts can't login. Run them from the public wiki pages.)</wiki>
139
+ <hr>
140
+ Last edited May 28, 2003
141
+ </body>
142
+ </html>
143
+
@@ -0,0 +1,128 @@
1
+ <html>
2
+ <head>
3
+ <title>Wiki: Music Example With Errors</title>
4
+ <head>
5
+ <body bgcolor=#FFFFFF link=#d06040 vlink=#806040>
6
+ <h1>Music Example With Errors</h1>
7
+ <wiki>In this example we describe a music player as if we were operating it. This is an intentionally corrupted version of the MusicExample that shows how various errors are reported.
8
+ <p>We'll write the remainder of this page as if it were describing stories for the music player. We'll use italics when we want to point out features of the framework. You might as well run the example now before you continue reading.
9
+ <p><UL>
10
+ <li> <a href="run.cgi">http:run.cgi</a>
11
+ <p><p><p></UL>
12
+ <hr>
13
+ <p><strong>Browsing Music</strong>
14
+ <p>The music browser starts up looking at the whole library of songs. We specify the library (an advanced feature) so that we know what we are talking about in this document.
15
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
16
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
17
+ <tr><td> start </td><td> eg.music.Browser </td><td>&nbsp;</td></tr>
18
+ <tr><td> enter </td><td> library </td><td> Source/eg/music/Music.txt </td></tr>
19
+ <tr><td> check </td><td> total songs </td><td> 36 </td></tr>
20
+ </table>
21
+ <p><em>This is a the file that library reads. It is tab separated text. Try downloading it and looking at it with a spreadsheet. <a href="Release/Source/eg/music/Music.txt">http:Release/Source/eg/music/Music.txt</a></em>
22
+ <p>We can pick songs and see details of our selection as we go.
23
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
24
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
25
+ <tr><td> enter </td><td> select </td><td> 1 </td></tr>
26
+ <tr><td> check </td><td> title </td><td> Akila </td></tr>
27
+ <tr><td> check </td><td> artist </td><td> Toure Kunda </td></tr>
28
+ <tr><td> enter </td><td> select </td><td> 2 </td></tr>
29
+ <tr><td> check </td><td> title </td><td> American Tango </td></tr>
30
+ <tr><td> check </td><td> artist </td><td> Weather Report </td></tr>
31
+ <tr><td> check </td><td> album </td><td> Mysterious Traveller </td></tr>
32
+ <tr><td> check </td><td> year </td><td> 1975 </td></tr>
33
+ <tr><td> check </td><td> time </td><td> 3.70 </td></tr>
34
+ <tr><td> check </td><td> track </td><td> 2 of 7 </td></tr>
35
+ </table>
36
+ <p><em>ActionFixture interprets the words in the first column. The </em>check<em> action leads to a comparison of </em>expected<em> values from the table with </em>actual<em> values from the music program.</em>
37
+ <p><hr>
38
+ <p><strong>Playing Music</strong>
39
+ <p>Once we've picked a song, we can play it. We can continue operating the Brower while music is playing.
40
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
41
+ <tr><td ColSpan=3> eg.music.Realtime </td></tr>
42
+ <tr><td> press </td><td> play </td><td>&nbsp;</td></tr>
43
+ <tr><td> check </td><td> status </td><td> loading </td></tr>
44
+ <tr><td> pause </td><td> 2 </td><td>&nbsp;</td></tr>
45
+ <tr><td> check </td><td> status </td><td> playing </td></tr>
46
+ <tr><td> pause </td><td> 2 </td><td>&nbsp;</td></tr>
47
+ <tr><td> check </td><td> status </td><td> playing </td></tr>
48
+ <tr><td> check </td><td> time </td><td> 3.70 </td></tr>
49
+ <tr><td> press </td><td> pause </td><td>&nbsp;</td></tr>
50
+ <tr><td> check </td><td> status </td><td> pause </td></tr>
51
+ <tr><td> check </td><td> remaining </td><td> 3.66 </td></tr>
52
+ <tr><td> pause </td><td> 60 </td><td>&nbsp;</td></tr>
53
+ <tr><td> check </td><td> remaining </td><td> 3.66 </td></tr>
54
+ <tr><td> press </td><td> play </td><td>&nbsp;</td></tr>
55
+ <tr><td> check </td><td> status </td><td> playing </td></tr>
56
+ <tr><td> pause </td><td> 60 </td><td>&nbsp;</td></tr>
57
+ <tr><td> check </td><td> remaining </td><td> 2.66 </td></tr>
58
+ <tr><td> await </td><td> play complete </td><td>&nbsp;</td></tr>
59
+ <tr><td> check </td><td> status </td><td> ready </td></tr>
60
+ </table>
61
+ <p><em>The RealtimeActionFixture is a Fixture that adds actions having to do with realtime operation of the music player. We start by pressing </em>play<em> and then waiting for the </em>status<em> to show that it is playing. This music takes 2.5 seconds to start playing so it still says </em>loading<em> after our 2 second pause.</em>
62
+ <p><em>Warning: Don't confuse the </em>pause<em> action with the </em>pause<em> button. The pause action appears in column one where it is interpreted by the Simulator as if the user hesitates for a specified number of seconds. The pause button is a button on the music player part of the Browser screen. The </em>press<em> action activates the pause button which causes the currently playing song to stop temporarily.</em>
63
+ <p><hr>
64
+ <p><strong>Searching for Music</strong>
65
+ <p>There are buttons on the browser to find more songs like the one we have picked.
66
+ <p>We can find songs related in different ways. Each new way produces a (possibly) different list of songs. <em>Show all</em> restores the display to the initial conditions.
67
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
68
+ <tr><td ColSpan=3> eg.music.Realtime </td></tr>
69
+ <tr><td> press </td><td> show all </td><td>&nbsp;</td></tr>
70
+ <tr><td> check </td><td> selected songs </td><td> 37 </td></tr>
71
+ <tr><td> enter </td><td> select </td><td> 3 </td></tr>
72
+ <tr><td> check </td><td> artist </td><td> James Taylor </td></tr>
73
+ <tr><td> press </td><td> same artist </td><td>&nbsp;</td></tr>
74
+ <tr><td> check </td><td> selected songs </td><td> 5 </td></tr>
75
+ </table>
76
+ <p><em>We left out the </em>await<em> actions so we are mashing buttons every second or so, faster than the searches complete. We're still getting the music we wanted because the search routines don't yet do a very good job of simulating being slow.</em>
77
+ <p>Yielding the display:
78
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
79
+ <tr><td ColSpan=6> eg.music.Display </td></tr>
80
+ <tr><td> title </td><td> artist </td><td> album </td><td> year </td><td> time() </td><td> track() </td></tr>
81
+ <tr><td> Handy Man </td><td> James Taylor </td><td> JT </td><td> 1977 </td><td> 3.30 </td><td> 7 of 12 </td></tr>
82
+ <tr><td> Scarlet Woman </td><td> Weather Report </td><td> Mysterious Traveller </td><td> 1974 </td><td> 5.72 </td><td> 6 of 7 </td></tr>
83
+ <tr><td> Sailing To Philadelphia </td><td> James Taylor </td><td> October Rose </td><td> 2000 </td><td> 5.47 </td><td> 3 of 3 </td></tr>
84
+ <tr><td> Ananas </td><td> James Taylor </td><td> Hourglass </td><td> 1997 </td><td> 5.73 </td><td> 5 of 13 </td></tr>
85
+ <tr><td> Another Gray Morning </td><td> James Taylor </td><td> JT </td><td> 1977 </td><td> 2.73 </td><td> 4 of 12 </td></tr>
86
+ </table>
87
+ <p><em>The song Scarlet Woman is marked as missing because our search did not return this row. It really is missing, and rightfully so, because it isn't a James Taylor song.</em>
88
+ <p><em>The song Another Gray Morning is marked as missing because there is no song spelt that way in the result set. When left hand columns (the keys) disagree then we don't get a chance to compare the remaining columns.</em>
89
+ <p><em>The song Copperline wasn't expected in the result set so it is marked as </em>surplus.<em> The framework adds all the surplus songs to the table so that they can be seen. The show up with printing in light gray as a reminder that they are not a part of the original document.</em>
90
+ <p><p><em>This completes the MusicExample.</em>
91
+ <p><hr>
92
+ <p><p>Now we consider some degenerate cases just to be sure that they work. Suppose we did not uniquely identify rows. We have two songs from JT. What happens when there are surplus (only one expected) ? When there are missing (three expelcted)?
93
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
94
+ <tr><td ColSpan=6> eg.music.Display </td></tr>
95
+ <tr><td> album </td><td> genre </td></tr>
96
+ <tr><td> October Rose </td><td> Pop </td></tr>
97
+ <tr><td> Hourglass </td><td> Pop </td></tr>
98
+ <tr><td> New Moon Shine </td><td> Pop </td></tr>
99
+ <tr><td> JT </td><td> Pop </td></tr>
100
+ </table>
101
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
102
+ <tr><td ColSpan=6> eg.music.Display </td></tr>
103
+ <tr><td> album </td><td> genre </td></tr>
104
+ <tr><td> JT </td><td> Pop </td></tr>
105
+ <tr><td> October Rose </td><td> Pop </td></tr>
106
+ <tr><td> JT </td><td> Pop </td></tr>
107
+ <tr><td> Hourglass </td><td> Pop </td></tr>
108
+ <tr><td> JT </td><td> Pop </td></tr>
109
+ <tr><td> New Moon Shine </td><td> Pop </td></tr>
110
+ </table>
111
+ <p><hr>
112
+ <p>We've run quite a few test. We'll call up one more Fixture that will add a summary to the end of our document.
113
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
114
+ <tr><td ColSpan=2> fit.Summary </td></tr>
115
+ </table>
116
+ <p>This is our most complete standard example. You can run it against more than one fit implementation by choosing any one of these specialized RunScript.
117
+ <p><UL>
118
+ <li> <a href="files/LispPlatform/runScheme.cgi">http:files/LispPlatform/runScheme.cgi</a>
119
+ <li> <a href="files/LispPlatform/runLisp.cgi">http:files/LispPlatform/runLisp.cgi</a>
120
+ <p></UL>
121
+ (Caution: these scripts can't login. Run them from the public wiki pages.)
122
+ <p>�
123
+ </wiki>
124
+ <hr>
125
+ Last edited April 21, 2003
126
+ </body>
127
+ </html>
128
+
@@ -0,0 +1,47 @@
1
+ <html>
2
+ <head>
3
+ <title>Wiki: Network Example</title>
4
+ <head>
5
+ <body bgcolor=#FFFFFF link=#d06040 vlink=#806040>
6
+ <h1>Network Example</h1>
7
+ <wiki><em>We will be experimenting with acceptance testing technique using radio network routing algorithms as a sufficiently complicated example. Our testbed will be a recently reincarnated simulation which we have described briefly elsewhere. <a href="//c2.com/~ward/morse/SimNet/SimView.html">http://c2.com/~ward/mors ... Net/SimView.html</a>. -- WardCunningham</em>
8
+ <p>The simulator starts with no nodes. The <em>new city</em> button pops up a dialog for city information. Try <a href="run.cgi">http:run.cgi</a>.
9
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
10
+ <tr><td ColSpan=3>fit.ActionFixture</td></tr>
11
+ <tr><td>start</td><td>eg.net.Simulator</td><td>&nbsp;</td></tr>
12
+ <tr><td>check</td><td>nodes</td><td>0</td></tr>
13
+ <tr><td>press</td><td>new city</td><td>&nbsp;</td></tr>
14
+ <tr><td>enter</td><td>name</td><td>Portland</td></tr>
15
+ <tr><td>enter</td><td>zip</td><td>1,1,1</td></tr>
16
+ <tr><td>enter</td><td>population</td><td>1.5e6</td></tr>
17
+ <tr><td>enter</td><td>coord</td><td>45 30.0 n 122 45.0 w</td></tr>
18
+ <tr><td>check</td><td>coord</td><td>N45.5 W122.75</td></tr>
19
+ <tr><td>press</td><td>ok</td><td>&nbsp;</td></tr>
20
+ <tr><td>check</td><td>nodes</td><td>1</td></tr>
21
+ <tr><td>press</td><td>new city</td><td>&nbsp;</td></tr>
22
+ <tr><td>enter</td><td>name</td><td>Salem</td></tr>
23
+ <tr><td>enter</td><td>population</td><td>.6e6</td></tr>
24
+ <tr><td>enter</td><td>zip</td><td>1,1,2</td></tr>
25
+ <tr><td>enter</td><td>coord</td><td>44 59' 22" n 122 28' 59" w</td></tr>
26
+ <tr><td>press</td><td>ok</td><td>&nbsp;</td></tr>
27
+ <tr><td>check</td><td>nodes</td><td>2</td></tr>
28
+ <tr><td>press</td><td>new city</td><td>&nbsp;</td></tr>
29
+ <tr><td>enter</td><td>name</td><td>Seattle</td></tr>
30
+ <tr><td>press</td><td>cancel</td><td>&nbsp;</td></tr>
31
+ <tr><td>check</td><td>nodes</td><td>2</td></tr>
32
+ </table>
33
+ <p><p><hr>
34
+ <p>An ActionFixture delegates much of its work to other fixtures (actors). See the source for the actor(s) in use here.
35
+ <p><UL>
36
+ <li> <a href="Release/Source/eg/net/Simulator.java">http:Release/Source/eg/net/Simulator.java</a>
37
+ <p></UL>
38
+ This fixture employs a domain specific ValueObject called a GeoCoordinate. The framework goes to some lenght to make sure such objects can be parsed and printed within the framework. Actual parsing and printing are easily delegated to the domain object, as they are here by GeoCoordinate, which accepts a wide variety of coordinate notations.
39
+ <p><UL>
40
+ <li> <a href="Release/Source/eg/net/GeoCoordinate.java">http:Release/Source/eg/n ... oCoordinate.java</a>
41
+ <p></UL>
42
+ </wiki>
43
+ <hr>
44
+ Last edited September 10, 2002
45
+ </body>
46
+ </html>
47
+
@@ -0,0 +1,92 @@
1
+ <html>
2
+ <head>
3
+ <title>Wiki: Web Page Example</title>
4
+ <head>
5
+ <body bgcolor=#FFFFFF link=#d06040 vlink=#806040>
6
+ <h1>Web Page Example</h1>
7
+ <wiki>We will look around the fit website.
8
+ <p>Oops. This doesn't work yet because the java HTTP object doesn't seem to send along the Host field on a HTTP GET so c2.com's web server can route the request to the correct virtual server. Bummer.
9
+ <p><p><a href="run.cgi">http:run.cgi</a>
10
+ <p>For now we look around Google instead.
11
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
12
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
13
+ <tr><td> start </td><td> eg.Page </td><td>&nbsp;</td></tr>
14
+ <tr><td> enter </td><td> location </td><td> <a href="//google.com">http://google.com</a> </td></tr>
15
+ <tr><td> check </td><td> title </td><td> Google </td></tr>
16
+ <tr><td> enter </td><td> link </td><td> Jobs </td></tr>
17
+ <tr><td> check </td><td> title </td><td> About Google </td></tr>
18
+ <tr><td> enter </td><td> link </td><td> Press </td></tr>
19
+ <tr><td> enter </td><td> link </td><td> Review </td></tr>
20
+ <tr><td> check </td><td> title </td><td> Google Press Room </td></tr>
21
+ </table>
22
+ <p>Here is what this page is suppose to look like.
23
+ <p><UL>
24
+ <li> <a href="files/WebPageExample/page.pdf">http:files/WebPageExample/page.pdf</a>
25
+ <p></UL>
26
+ See the source.
27
+ <p><UL>
28
+ <li> <a href="Release/Source/eg/Page.java">http:Release/Source/eg/Page.java</a>
29
+ <p></UL>
30
+ <hr>
31
+ <p><em>Java gurus suggest that the problem is related to weak libraries in the kaffe implementation and that either sun or ibm jvm will make problems go away.</em>
32
+ <p>Testing server side java ...
33
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
34
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
35
+ <tr><td> start </td><td> eg.Page </td><td>&nbsp;</td></tr>
36
+ <tr><td> enter </td><td> location </td><td> <a href="//fit.c2.com">http://fit.c2.com</a> </td></tr>
37
+ <tr><td> check </td><td> title </td><td> Wiki: Welcome Visitors </td></tr>
38
+ </table>
39
+ <p><hr>
40
+ <p>I wrote this example to help get WilkesJoiner and JimWeaver started with our framework. They didn't seem to need it. While I'm still debuging they are distributing a similar fixture exploiting their jwebunit facade to HttpUnit. Nice work guys. -- WardCunningham
41
+ <p><p><hr>
42
+ <p>In this example we will use a fixture to look around the web. Developers of web applications often get the idea that this is a good universal interface to their programs. We don't think so. You are far better off testing your server site objects from fixturing running on the server. But you will probably want to do some testing over http so we show here how it can be done.
43
+ <p>You can run this test on the fit.c2.com server with the usual run.cgi command. This will have c2.com acting as a client on your behalf.
44
+ <p><a href="run.cgi">http:run.cgi</a>
45
+ <p>We use actions to start eg.Page, our web browser like fixture. We can enter location, a web address, or link, which follows a link on the page to a new location. When we enter a link, the fixture searches the current page for an anchor that starts with the entered text. You only have to enter enough to be unique. Then it retrieves that page.
46
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
47
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
48
+ <tr><td> start </td><td> eg.Page </td><td>&nbsp;</td></tr>
49
+ <tr><td> enter </td><td> location </td><td> <a href="//fit.c2.com">http://fit.c2.com</a> </td></tr>
50
+ <tr><td> check </td><td> title </td><td> Wiki: Welcome Visitors </td></tr>
51
+ <tr><td> enter </td><td> link </td><td> Example </td></tr>
52
+ <tr><td> check </td><td> title </td><td> Wiki: Example Tests </td></tr>
53
+ <tr><td> enter </td><td> link </td><td> Simple </td></tr>
54
+ <tr><td> check </td><td> title </td><td> Wiki: Simple Example </td></tr>
55
+ </table>
56
+ <p>The eg.Page fixture is also a row fixture. Here we use it that way to check on the rows of the SimpleExample.
57
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
58
+ <tr><td ColSpan=2> eg.Page </td></tr>
59
+ <tr><td> numerator() </td><td> denominator() </td></tr>
60
+ <tr><td> 1000 </td><td> 10 </td></tr>
61
+ <tr><td> 1000 </td><td> 7 </td></tr>
62
+ <tr><td> 1000 </td><td> 0 </td></tr>
63
+ <tr><td> 1000 </td><td> .001 </td></tr>
64
+ <tr><td> -1000 </td><td> 10 </td></tr>
65
+ <tr><td> 0 </td><td> 0 </td></tr>
66
+ </table>
67
+ <p>We left out the pentium bug values on purpose just so you would know we really are reading from that page. We will follow the pentium bug reference just to show that we can read from other servers.
68
+ <p><table BORDER CELLSPACING=0 CELLPADDING=3>
69
+ <tr><td ColSpan=3> fit.ActionFixture </td></tr>
70
+ <tr><td> enter </td><td> link </td><td> <a href="//www.cs.earlham">http://www.cs.earlham</a> </td></tr>
71
+ <tr><td> check </td><td> title </td><td> Bugs in the Intel Microprocessors </td></tr>
72
+ <tr><td> enter </td><td> link </td><td> Main </td></tr>
73
+ <tr><td> enter </td><td> link </td><td> Dusko </td></tr>
74
+ <tr><td> enter </td><td> link </td><td> web </td></tr>
75
+ <tr><td> check </td><td> title </td><td> WebDB - Version 3.1 </td></tr>
76
+ </table>
77
+ <p>There are a couple of things that are not quite right about this example.
78
+ <p><UL>
79
+ <li> It seems odd to say | enter | link | foo | when we want to click a link. The reflection that ActionFixture is doing for us isn't really helping us out much.
80
+ <p><li> Our fixture only knows one query and that assumes we are on a page with a very specific table.
81
+ <p></UL>
82
+ See source.
83
+ <p><UL>
84
+ <li> <a href="Release/Source/eg/Page.java">http:Release/Source/eg/Page.java</a>
85
+ <p><p><p></UL>
86
+ <hr>
87
+ <p>It would be neat to see some tests of an XML interface. Google has one.</wiki>
88
+ <hr>
89
+ Last edited November 13, 2002
90
+ </body>
91
+ </html>
92
+