rubylabs 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.rdoc +9 -0
- data/Rakefile +63 -0
- data/VERSION +1 -0
- data/bin/bb.rb +12 -0
- data/bin/statistics2-0.53/ext/extconf.rb +11 -0
- data/bin/statistics2-0.53/ext/show.rb +11 -0
- data/bin/statistics2-0.53/ext/t.rb +46 -0
- data/bin/statistics2-0.53/mklist.rb +26 -0
- data/bin/statistics2-0.53/sample-tbl.rb +129 -0
- data/bin/statistics2-0.53/statistics2.rb +532 -0
- data/bin/statistics2-0.53/t-inv.rb +54 -0
- data/bin/statistics2.rb +532 -0
- data/data/aafreq.txt +20 -0
- data/data/cars.txt +50 -0
- data/data/century.txt +1 -0
- data/data/colors.txt +64 -0
- data/data/earth.yaml +15 -0
- data/data/fruit.txt +45 -0
- data/data/hacodes.txt +35 -0
- data/data/hafreq.txt +16 -0
- data/data/hvfreq.txt +5 -0
- data/data/nbody.R +23 -0
- data/data/nbody.out +731 -0
- data/data/nbody.pdf +3111 -0
- data/data/nbody.png +0 -0
- data/data/nbody3d.pdf +3201 -0
- data/data/outer.pdf +182785 -0
- data/data/solar.dat +36501 -0
- data/data/solarsystem.txt +17 -0
- data/data/suits.txt +1 -0
- data/data/wordlist.txt +210653 -0
- data/lib/bitlab.rb +624 -0
- data/lib/elizalab.rb +523 -0
- data/lib/encryptionlab.rb +42 -0
- data/lib/hashlab.rb +224 -0
- data/lib/introlab.rb +14 -0
- data/lib/iterationlab.rb +130 -0
- data/lib/randomlab.rb +294 -0
- data/lib/recursionlab.rb +228 -0
- data/lib/rubylabs.rb +507 -0
- data/lib/sievelab.rb +58 -0
- data/lib/sortlab.rb +213 -0
- data/lib/spherelab.rb +352 -0
- data/lib/temps.rb +41 -0
- data/lib/tsplab.rb +416 -0
- data/lib/viewer.rb +65 -0
- data/test/bit_test.rb +175 -0
- data/test/encryption_test.rb +20 -0
- data/test/iteration_test.rb +40 -0
- data/test/random_test.rb +64 -0
- data/test/recursion_test.rb +47 -0
- data/test/rubylabs_test.rb +18 -0
- data/test/sieve_test.rb +28 -0
- data/test/sphere_test.rb +130 -0
- data/test/temps_test.rb +24 -0
- data/test/test_helper.rb +18 -0
- metadata +112 -0
data/test/random_test.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
include RandomLab
|
5
|
+
|
6
|
+
class TestRandoms < Test::Unit::TestCase
|
7
|
+
|
8
|
+
# For the Card tests, a call to the Card constructor with an integer argument
|
9
|
+
# makes a specified card, starting with 0 = A ♠ and ending with 51 = 2 ♣.
|
10
|
+
|
11
|
+
# Make a full deck, make sure every card is present. Then shuffle the deck,
|
12
|
+
# check again. Sort the shuffled deck, make sure all cards are there and in
|
13
|
+
# order.
|
14
|
+
|
15
|
+
def test_01_decks
|
16
|
+
deck1 = deal((0..51).to_a)
|
17
|
+
check_all_cards(deck1)
|
18
|
+
deck2 = shuffle
|
19
|
+
check_all_cards(deck2)
|
20
|
+
deck3 = deck2.sort
|
21
|
+
check_all_cards(deck3)
|
22
|
+
assert_equal deck1, deck3
|
23
|
+
end
|
24
|
+
|
25
|
+
# Make one of each kind of poker hand.
|
26
|
+
|
27
|
+
def test_02_poker_hands
|
28
|
+
print "\n poker hands"
|
29
|
+
assert_equal poker_hand(deal([0,1,2,3,4])), :straight_flush
|
30
|
+
assert_equal poker_hand(deal([0,13,26,39,1])), :four_of_a_kind
|
31
|
+
assert_equal poker_hand(deal([0,13,26,1,14])), :full_house
|
32
|
+
assert_equal poker_hand(deal([0,2,4,6,8])), :flush
|
33
|
+
assert_equal poker_hand(deal([0,14,2,3,4])), :straight
|
34
|
+
assert_equal poker_hand(deal([0,13,26,1,15])), :three_of_a_kind
|
35
|
+
assert_equal poker_hand(deal([0,13,1,14,15])), :two_pair
|
36
|
+
assert_equal poker_hand(deal([0,13,1,2,3])), :pair
|
37
|
+
assert_equal poker_hand(deal([0,14,29,44,45])), :nada
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
=begin rdoc
|
42
|
+
The +bins+ method makes a hash using keys based on suits or ranks
|
43
|
+
and initialized with a count of 0.
|
44
|
+
|
45
|
+
+check_all_cards+ makes sure there are 13 of each suit and 4 of each rank.
|
46
|
+
=end
|
47
|
+
|
48
|
+
def bins(a)
|
49
|
+
h = Hash.new
|
50
|
+
a.each do |x|
|
51
|
+
h[x] = 0
|
52
|
+
end
|
53
|
+
return h
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_all_cards(a)
|
57
|
+
rb = bins(Card::Ranks)
|
58
|
+
sb = bins(Card::Suits)
|
59
|
+
a.each { |x| rb[x.rank] += 1; sb[x.suit] += 1 }
|
60
|
+
rb.each { |x,n| assert_equal n, 4 }
|
61
|
+
sb.each { |x,n| assert_equal n, 13 }
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
include RecursionLab
|
5
|
+
|
6
|
+
class TestRecursiveAlgoritms < Test::Unit::TestCase
|
7
|
+
|
8
|
+
# Make some test arrays, try successful and unsuccessful searches.
|
9
|
+
# Test array sizes students will use (one less than power of two)
|
10
|
+
# plus some odd ones.
|
11
|
+
|
12
|
+
def test_01_bsearch
|
13
|
+
print "\n bsearch"
|
14
|
+
[14, 15, 16].each do |size|
|
15
|
+
a = TestArray.new(size).sort
|
16
|
+
assert_not_nil bsearch(a, a.random(:success))
|
17
|
+
assert_nil bsearch(a, a.random(:fail))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Students will run tests with array sizes that are a power of two,
|
22
|
+
# but run some tests on other sizes, too. Also checks to make sure
|
23
|
+
# the array is not modified
|
24
|
+
|
25
|
+
def test_02_msort
|
26
|
+
print "\n msort"
|
27
|
+
[15, 16, 17].each do |size|
|
28
|
+
a = TestArray.new(size)
|
29
|
+
b = a.dup
|
30
|
+
assert_equal msort(a), a.sort
|
31
|
+
assert_equal a, b
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Array size not a factor here -- just try a few sorts
|
36
|
+
|
37
|
+
def test_03_qsort
|
38
|
+
print "\n qsort"
|
39
|
+
[15, 16, 17].each do |size|
|
40
|
+
a = TestArray.new(size)
|
41
|
+
b = a.dup
|
42
|
+
assert_equal qsort(a), a.sort
|
43
|
+
assert_equal a, b
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class RubyLabsTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_00_arrays
|
7
|
+
print "\n test_array"
|
8
|
+
a = TestArray.new(10)
|
9
|
+
assert a.length == 10
|
10
|
+
assert a.include?(a.random(:success))
|
11
|
+
assert !a.include?(a.random(:fail))
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_01_scope
|
15
|
+
print "\n RubyScope [TBD]"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/test/sieve_test.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
include SieveLab
|
5
|
+
|
6
|
+
class TestSieve < Test::Unit::TestCase
|
7
|
+
|
8
|
+
# Compare list generated by sieve method with list from Wikipedia. Test both the main
|
9
|
+
# version (sieve) and the simple prototype that iterates until the worklist is empty.
|
10
|
+
|
11
|
+
def test_01_first_25
|
12
|
+
print "\n sieve"
|
13
|
+
expected = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
|
14
|
+
assert_equal expected, sieve(100)
|
15
|
+
assert_equal expected, proto_sieve(100)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Check length of list generated by sieve with expected number of primes (also from Wikipedia).
|
19
|
+
# pi[i] is the number of primes less than 10**i. Note: calling sieve(n) with n less than 2
|
20
|
+
# should quietly return an empty list.
|
21
|
+
|
22
|
+
def test_02_pi
|
23
|
+
pi = [0, 4, 25, 168, 1229, 9592]
|
24
|
+
for i in 0..(pi.length-1)
|
25
|
+
assert_equal pi[i], sieve(10**i).length
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/test/sphere_test.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
include SphereLab
|
5
|
+
|
6
|
+
=begin rdoc
|
7
|
+
This test file includes simple unit tests for the Vector and Body classes used in
|
8
|
+
the n-body simulation chapter, plus a more complicated test that should really be
|
9
|
+
an integration test. The complicated test is a mini-simulation of the movement
|
10
|
+
of the four inner planets over a period of 88 days (enough time for Mercury to make
|
11
|
+
a complete orbit of the sun). To see a plot of the simulation results run this
|
12
|
+
script with a file name as the command line argument, then run an R script (which
|
13
|
+
should be included in the tests directory) that will read the data and generate a plot:
|
14
|
+
% ruby sphere_test.rb nbody.out
|
15
|
+
% Rscript nbody.R
|
16
|
+
% open nbody.png
|
17
|
+
=end
|
18
|
+
|
19
|
+
class TestSpheres < Test::Unit::TestCase
|
20
|
+
|
21
|
+
# Vector arithmetic. Note: calls to assert_equal will also test the == method.
|
22
|
+
|
23
|
+
def test_01_vectors
|
24
|
+
print "\n vectors"
|
25
|
+
|
26
|
+
v1 = Vector.new(1, 1, 1)
|
27
|
+
v2 = Vector.new(2, 2, 2)
|
28
|
+
v3 = Vector.new(3, 3, 3)
|
29
|
+
|
30
|
+
assert_equal v3, v1 + v2
|
31
|
+
assert_equal v1, v3 - v2
|
32
|
+
assert_equal v2, v1 * 2
|
33
|
+
|
34
|
+
v3.add(v1)
|
35
|
+
assert_equal v3, Vector.new(4, 4, 4)
|
36
|
+
v3.sub(v1)
|
37
|
+
assert_equal v3, Vector.new(3, 3, 3)
|
38
|
+
|
39
|
+
assert_in_delta v2.norm, Math.sqrt(12), Float::EPSILON
|
40
|
+
end
|
41
|
+
|
42
|
+
# Body objects -- make two of them, test calculation of force attraction between them,
|
43
|
+
# verify movement is equal magnitude and in opposite direction (i.e. bodies move toward
|
44
|
+
# each other on the y axis).
|
45
|
+
|
46
|
+
def test_02_bodies
|
47
|
+
print "\n bodies"
|
48
|
+
y1 = 1000
|
49
|
+
y2 = 0
|
50
|
+
b1 = Body.new(1000000, Vector.new(0, y1, 0), Vector.new(0, 0, 0))
|
51
|
+
b2 = Body.new(1000000, Vector.new(0, y2, 0), Vector.new(0, 0, 0))
|
52
|
+
b1.add_force(b2)
|
53
|
+
b2.add_force(b1)
|
54
|
+
b1.move(100)
|
55
|
+
b2.move(100)
|
56
|
+
assert_equal b1.position.x, 0.0
|
57
|
+
assert_equal b1.position.x, 0.0
|
58
|
+
assert_in_delta (y1 - b1.position.y), (b2.position.y - y2), 1e-10
|
59
|
+
assert_equal b1.position.z, 0.0
|
60
|
+
assert_equal b1.position.z, 0.0
|
61
|
+
end
|
62
|
+
|
63
|
+
# Same as above, but use the class method (which does the calculation once and
|
64
|
+
# uses the same force twice)
|
65
|
+
|
66
|
+
def test_03_interaction
|
67
|
+
print "\n interaction"
|
68
|
+
y1 = 1000
|
69
|
+
y2 = 0
|
70
|
+
b1 = Body.new(1000000, Vector.new(0, y1, 0), Vector.new(0, 0, 0))
|
71
|
+
b2 = Body.new(1000000, Vector.new(0, y2, 0), Vector.new(0, 0, 0))
|
72
|
+
Body.interaction(b1, b2)
|
73
|
+
b1.move(100)
|
74
|
+
b2.move(100)
|
75
|
+
assert_equal b1.position.x, 0.0
|
76
|
+
assert_equal b1.position.x, 0.0
|
77
|
+
assert_in_delta (y1 - b1.position.y), (b2.position.y - y2), 1e-10
|
78
|
+
assert_equal b1.position.z, 0.0
|
79
|
+
assert_equal b1.position.z, 0.0
|
80
|
+
end
|
81
|
+
|
82
|
+
# Test the Body class by doing a mini-simulation of bodies based on the sun and
|
83
|
+
# inner planets of the solar system. Uses coordinates based on the JPL ephemeris
|
84
|
+
# for Jan 1 1970. Run for 88 time steps, with dt = 1 day. Expect mercury to be
|
85
|
+
# close to where it started, and earth to be about 1/4 through its orbit.
|
86
|
+
|
87
|
+
def test_04_solar_system
|
88
|
+
print "\n solar system"
|
89
|
+
|
90
|
+
bodies = [
|
91
|
+
Body.new(1.989E30, Vector.new(0,0.000E00,0), Vector.new(0.000E0,0,0), "sun"),
|
92
|
+
Body.new(3.303E23, Vector.new(3.83E+10, 2.87E+10, -1.17E+09), Vector.new(-38787.67, 41093.05, 6918.461), "mercury"),
|
93
|
+
Body.new(4.870E24, Vector.new(-5.37E+09, -1.08E+11, -1.16E+09), Vector.new(34741.48, -1865.747, -2031.506), "venus"),
|
94
|
+
Body.new(5.976E24, Vector.new(-2.70E+10, 1.44E+11, 9686451), Vector.new(-29770.44, -5568.042, 0.3961261), "earth"),
|
95
|
+
Body.new(6.421E23, Vector.new(1.98E+11, 7.42E+10, -3.33E+09), Vector.new(-7557.626, 24761.27, 704.7457), "mars")
|
96
|
+
]
|
97
|
+
|
98
|
+
mercury = bodies[1]
|
99
|
+
|
100
|
+
dt = 86459 # number of seconds in a day (at 365.25 days/year)
|
101
|
+
nb = bodies.length # number of bodies
|
102
|
+
nt = 88 # number of time steps (simulated days); 88 is enough for 1 orbit for Mercury
|
103
|
+
|
104
|
+
myfirst = mercury.position.clone
|
105
|
+
|
106
|
+
nt.times do |t| # main simulation loop
|
107
|
+
|
108
|
+
for i in 0...nb # compute all pairwise interactions
|
109
|
+
for j in (i+1)...nb
|
110
|
+
Body.interaction( bodies[i], bodies[j] )
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
bodies.each do |b|
|
115
|
+
b.move(dt) # apply the accumulated forces
|
116
|
+
b.clear_force # reset force to 0 for next round
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
# Check to see if Mercury is close to where it started...
|
122
|
+
|
123
|
+
if nt == 88
|
124
|
+
assert_in_delta myfirst.x, mercury.position.x, 1e10
|
125
|
+
assert_in_delta myfirst.y, mercury.position.y, 1e10
|
126
|
+
assert_in_delta myfirst.z, mercury.position.z, 1e10
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
data/test/temps_test.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
include Temps
|
5
|
+
|
6
|
+
class TestTemps < Test::Unit::TestCase
|
7
|
+
|
8
|
+
# Check a few Faherenheit-to-Celsius conversions
|
9
|
+
|
10
|
+
def test_01_celsius
|
11
|
+
print "\n celsius"
|
12
|
+
assert_equal 100, celsius(212)
|
13
|
+
assert_equal 0, celsius(32)
|
14
|
+
assert_equal 26, celsius(80)
|
15
|
+
assert_equal "26.6666", celsius(80.0).to_s.slice(0..6)
|
16
|
+
end
|
17
|
+
|
18
|
+
# The fahrenheit method is a stub...
|
19
|
+
|
20
|
+
def test_02_fahrenheit
|
21
|
+
print "\n fahrenheit"
|
22
|
+
assert_nil fahrenheit(100)
|
23
|
+
end
|
24
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
5
|
+
|
6
|
+
require 'rubylabs'
|
7
|
+
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
|
10
|
+
def max(a, b)
|
11
|
+
return (a > b) ? a : b
|
12
|
+
end
|
13
|
+
|
14
|
+
def min(a, b)
|
15
|
+
return (a < b) ? a : b
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubylabs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- conery
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-24 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A set of modules for interactive experiments in an introductory computer science class.
|
17
|
+
email: conery@cs.uoregon.edu
|
18
|
+
executables:
|
19
|
+
- bb.rb
|
20
|
+
- statistics2.rb
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files:
|
24
|
+
- LICENSE
|
25
|
+
- README.rdoc
|
26
|
+
files:
|
27
|
+
- LICENSE
|
28
|
+
- README.rdoc
|
29
|
+
- Rakefile
|
30
|
+
- VERSION
|
31
|
+
- bin/bb.rb
|
32
|
+
- bin/statistics2-0.53/ext/extconf.rb
|
33
|
+
- bin/statistics2-0.53/ext/show.rb
|
34
|
+
- bin/statistics2-0.53/ext/t.rb
|
35
|
+
- bin/statistics2-0.53/mklist.rb
|
36
|
+
- bin/statistics2-0.53/sample-tbl.rb
|
37
|
+
- bin/statistics2-0.53/statistics2.rb
|
38
|
+
- bin/statistics2-0.53/t-inv.rb
|
39
|
+
- bin/statistics2.rb
|
40
|
+
- data/aafreq.txt
|
41
|
+
- data/cars.txt
|
42
|
+
- data/century.txt
|
43
|
+
- data/colors.txt
|
44
|
+
- data/earth.yaml
|
45
|
+
- data/fruit.txt
|
46
|
+
- data/hacodes.txt
|
47
|
+
- data/hafreq.txt
|
48
|
+
- data/hvfreq.txt
|
49
|
+
- data/nbody.R
|
50
|
+
- data/nbody.out
|
51
|
+
- data/nbody.pdf
|
52
|
+
- data/nbody.png
|
53
|
+
- data/nbody3d.pdf
|
54
|
+
- data/outer.pdf
|
55
|
+
- data/solar.dat
|
56
|
+
- data/solarsystem.txt
|
57
|
+
- data/suits.txt
|
58
|
+
- data/wordlist.txt
|
59
|
+
- lib/bitlab.rb
|
60
|
+
- lib/elizalab.rb
|
61
|
+
- lib/encryptionlab.rb
|
62
|
+
- lib/hashlab.rb
|
63
|
+
- lib/introlab.rb
|
64
|
+
- lib/iterationlab.rb
|
65
|
+
- lib/randomlab.rb
|
66
|
+
- lib/recursionlab.rb
|
67
|
+
- lib/rubylabs.rb
|
68
|
+
- lib/sievelab.rb
|
69
|
+
- lib/sortlab.rb
|
70
|
+
- lib/spherelab.rb
|
71
|
+
- lib/temps.rb
|
72
|
+
- lib/tsplab.rb
|
73
|
+
- lib/viewer.rb
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://github.com/conery/rubylabs
|
76
|
+
licenses: []
|
77
|
+
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options:
|
80
|
+
- --charset=UTF-8
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
88
|
+
version:
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: "0"
|
94
|
+
version:
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project: rubylabs
|
98
|
+
rubygems_version: 1.3.5
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Software and data for lab projects in the Science of Computing text.
|
102
|
+
test_files:
|
103
|
+
- test/bit_test.rb
|
104
|
+
- test/encryption_test.rb
|
105
|
+
- test/iteration_test.rb
|
106
|
+
- test/random_test.rb
|
107
|
+
- test/recursion_test.rb
|
108
|
+
- test/rubylabs_test.rb
|
109
|
+
- test/sieve_test.rb
|
110
|
+
- test/sphere_test.rb
|
111
|
+
- test/temps_test.rb
|
112
|
+
- test/test_helper.rb
|