rubyzip 0.9.1 → 2.3.2

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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +354 -0
  3. data/Rakefile +15 -104
  4. data/TODO +0 -1
  5. data/lib/zip/central_directory.rb +212 -0
  6. data/lib/zip/compressor.rb +9 -0
  7. data/lib/zip/constants.rb +115 -0
  8. data/lib/zip/crypto/decrypted_io.rb +40 -0
  9. data/lib/zip/crypto/encryption.rb +11 -0
  10. data/lib/zip/crypto/null_encryption.rb +43 -0
  11. data/lib/zip/crypto/traditional_encryption.rb +99 -0
  12. data/lib/zip/decompressor.rb +31 -0
  13. data/lib/zip/deflater.rb +34 -0
  14. data/lib/zip/dos_time.rb +53 -0
  15. data/lib/zip/entry.rb +719 -0
  16. data/lib/zip/entry_set.rb +88 -0
  17. data/lib/zip/errors.rb +19 -0
  18. data/lib/zip/extra_field/generic.rb +44 -0
  19. data/lib/zip/extra_field/ntfs.rb +94 -0
  20. data/lib/zip/extra_field/old_unix.rb +46 -0
  21. data/lib/zip/extra_field/universal_time.rb +77 -0
  22. data/lib/zip/extra_field/unix.rb +39 -0
  23. data/lib/zip/extra_field/zip64.rb +70 -0
  24. data/lib/zip/extra_field/zip64_placeholder.rb +15 -0
  25. data/lib/zip/extra_field.rb +103 -0
  26. data/lib/zip/file.rb +468 -0
  27. data/lib/zip/filesystem.rb +643 -0
  28. data/lib/zip/inflater.rb +54 -0
  29. data/lib/zip/input_stream.rb +180 -0
  30. data/lib/zip/ioextras/abstract_input_stream.rb +122 -0
  31. data/lib/zip/ioextras/abstract_output_stream.rb +43 -0
  32. data/lib/zip/ioextras.rb +21 -140
  33. data/lib/zip/null_compressor.rb +15 -0
  34. data/lib/zip/null_decompressor.rb +19 -0
  35. data/lib/zip/null_input_stream.rb +10 -0
  36. data/lib/zip/output_stream.rb +198 -0
  37. data/lib/zip/pass_thru_compressor.rb +23 -0
  38. data/lib/zip/pass_thru_decompressor.rb +31 -0
  39. data/lib/zip/streamable_directory.rb +15 -0
  40. data/lib/zip/streamable_stream.rb +52 -0
  41. data/lib/zip/version.rb +3 -0
  42. data/lib/zip.rb +72 -0
  43. data/samples/example.rb +44 -32
  44. data/samples/example_filesystem.rb +16 -19
  45. data/samples/example_recursive.rb +54 -0
  46. data/samples/gtk_ruby_zip.rb +84 -0
  47. data/samples/qtzip.rb +25 -34
  48. data/samples/write_simple.rb +10 -13
  49. data/samples/zipfind.rb +38 -45
  50. metadata +182 -91
  51. data/ChangeLog +0 -1504
  52. data/NEWS +0 -144
  53. data/README +0 -72
  54. data/install.rb +0 -22
  55. data/lib/download_quizzes.rb +0 -119
  56. data/lib/quiz1/t/solutions/Bill Guindon/solitaire.rb +0 -205
  57. data/lib/quiz1/t/solutions/Carlos/solitaire.rb +0 -111
  58. data/lib/quiz1/t/solutions/Dennis Ranke/solitaire.rb +0 -111
  59. data/lib/quiz1/t/solutions/Florian Gross/solitaire.rb +0 -301
  60. data/lib/quiz1/t/solutions/Glen M. Lewis/solitaire.rb +0 -268
  61. data/lib/quiz1/t/solutions/James Edward Gray II/solitaire.rb +0 -132
  62. data/lib/quiz1/t/solutions/Jamis Buck/bin/main.rb +0 -13
  63. data/lib/quiz1/t/solutions/Jamis Buck/lib/cipher.rb +0 -230
  64. data/lib/quiz1/t/solutions/Jamis Buck/lib/cli.rb +0 -24
  65. data/lib/quiz1/t/solutions/Jamis Buck/test/tc_deck.rb +0 -30
  66. data/lib/quiz1/t/solutions/Jamis Buck/test/tc_key-stream.rb +0 -19
  67. data/lib/quiz1/t/solutions/Jamis Buck/test/tc_keying-algorithms.rb +0 -31
  68. data/lib/quiz1/t/solutions/Jamis Buck/test/tc_solitaire-cipher.rb +0 -66
  69. data/lib/quiz1/t/solutions/Jamis Buck/test/tc_unkeyed-algorithm.rb +0 -17
  70. data/lib/quiz1/t/solutions/Jamis Buck/test/tests.rb +0 -2
  71. data/lib/quiz1/t/solutions/Jim Menard/solitaire_cypher.rb +0 -204
  72. data/lib/quiz1/t/solutions/Jim Menard/test.rb +0 -47
  73. data/lib/quiz1/t/solutions/Moses Hohman/cipher.rb +0 -97
  74. data/lib/quiz1/t/solutions/Moses Hohman/deck.rb +0 -140
  75. data/lib/quiz1/t/solutions/Moses Hohman/solitaire.rb +0 -14
  76. data/lib/quiz1/t/solutions/Moses Hohman/test_cipher.rb +0 -68
  77. data/lib/quiz1/t/solutions/Moses Hohman/test_deck.rb +0 -146
  78. data/lib/quiz1/t/solutions/Moses Hohman/test_util.rb +0 -38
  79. data/lib/quiz1/t/solutions/Moses Hohman/testsuite.rb +0 -5
  80. data/lib/quiz1/t/solutions/Moses Hohman/util.rb +0 -27
  81. data/lib/quiz1/t/solutions/Niklas Frykholm/solitaire.rb +0 -151
  82. data/lib/quiz1/t/solutions/Thomas Leitner/solitaire.rb +0 -198
  83. data/lib/zip/stdrubyext.rb +0 -111
  84. data/lib/zip/tempfile_bugfixed.rb +0 -195
  85. data/lib/zip/zip.rb +0 -1847
  86. data/lib/zip/zipfilesystem.rb +0 -609
  87. data/lib/zip/ziprequire.rb +0 -90
  88. data/samples/gtkRubyzip.rb +0 -86
  89. data/test/alltests.rb +0 -9
  90. data/test/data/file1.txt +0 -46
  91. data/test/data/file1.txt.deflatedData +0 -0
  92. data/test/data/file2.txt +0 -1504
  93. data/test/data/notzippedruby.rb +0 -7
  94. data/test/data/rubycode.zip +0 -0
  95. data/test/data/rubycode2.zip +0 -0
  96. data/test/data/testDirectory.bin +0 -0
  97. data/test/data/zipWithDirs.zip +0 -0
  98. data/test/gentestfiles.rb +0 -157
  99. data/test/ioextrastest.rb +0 -208
  100. data/test/stdrubyexttest.rb +0 -52
  101. data/test/zipfilesystemtest.rb +0 -831
  102. data/test/ziprequiretest.rb +0 -43
  103. data/test/ziptest.rb +0 -1599
@@ -1,204 +0,0 @@
1
- #! /usr/bin/env ruby
2
-
3
- RANKS = %w(A 2 3 4 5 6 7 8 9 10 J Q K)
4
- SUITS = %w(C D H S)
5
- JOKER_RANK = 'joker'
6
- JOKER_VALUE = -1
7
-
8
- class Card
9
- def Card.value_to_chr(value)
10
- i = value
11
- i -= 26 while i > 26
12
- (i + ?A - 1).chr
13
- end
14
- def Card.chr_to_value(chr)
15
- i = chr[0] - ?A + 1
16
- i += 26 while i < 0
17
- i
18
- end
19
-
20
- def initialize(rank, suit)
21
- @rank = rank
22
- @suit = suit
23
- if rank == JOKER_RANK
24
- @value = JOKER_VALUE
25
- else
26
- @value = (SUITS.index(suit) * 13) + RANKS.index(rank) + 1
27
- end
28
- end
29
-
30
- def to_s
31
- # return @value.to_s if @value != JOKER_VALUE
32
- # return @suit.to_s
33
- "#{@rank}#{@suit} #{@value.to_s}"
34
- end
35
-
36
- def to_i
37
- @value
38
- end
39
-
40
- def chr
41
- Card.value_to_chr(@value)
42
- end
43
- end
44
-
45
- class Deck
46
-
47
- def initialize
48
- @cards = []
49
- SUITS.each { | suit |
50
- RANKS.each { | rank | @cards << Card.new(rank, suit) }
51
- }
52
- @joker_a = Card.new(JOKER_RANK, 'A')
53
- @cards << @joker_a
54
- @joker_b = Card.new(JOKER_RANK, 'B')
55
- @cards << @joker_b
56
- end
57
-
58
- # Keys the deck and returns itself.
59
- def key
60
- # do nothing; keyed when initialized
61
- self
62
- end
63
-
64
- # Return the next kestream value as a number (not a string).
65
- # Keep going until we have a non-joker value.
66
- def next_keystream
67
- val = JOKER_VALUE
68
- until val != JOKER_VALUE
69
- val = generate_next_keystream_value
70
- end
71
- val
72
- end
73
-
74
- # Return the next keystream value as a number 1-26 (not a string).
75
- def generate_next_keystream_value
76
- move(@joker_a, 1)
77
- move(@joker_b, 2)
78
- triple_cut()
79
- count_cut()
80
- return output_number()
81
- end
82
-
83
- # Move a card a certain distance. Wrap around the end of the deck.
84
- def move(card, distance)
85
- old_pos = @cards.index(card)
86
- new_pos = old_pos + distance
87
- new_pos -= (@cards.length-1) if new_pos >= @cards.length
88
- @cards[old_pos,1] = []
89
- @cards[new_pos,0] = [card]
90
- end
91
-
92
- # Perform a triple cut around the two jokers. All cards above the top
93
- # joker move to below the bottom joker and vice versa. The jokers and the
94
- # cards between them do not move.
95
- def triple_cut
96
- i = @cards.index(@joker_a)
97
- j = @cards.index(@joker_b)
98
- j, i = i, j if j < i # make sure i < j
99
- @cards = slice(j+1, -1) + slice(i, j) + slice(0, i-1)
100
- end
101
-
102
- # Perform a count cut using the value of the bottom card. Cut the bottom
103
- # card's value in cards off the top of the deck and reinsert them just
104
- # above the bottom card.
105
- def count_cut
106
- i = @cards[@cards.length - 1].to_i
107
- @cards = slice(i, -2) + slice(0, i-1) + [@cards[@cards.length-1]]
108
- end
109
-
110
- # Returns a non-nil cut of cards from the deck.
111
- def slice(from, to)
112
- slice = @cards[from..to]
113
- return slice || []
114
- end
115
-
116
- # Return the output number (not letter). Convert the top card to it's
117
- # value and count down that many cards from the top of the deck, with the
118
- # top card itself being card number one. Look at the card immediately
119
- # after your count and convert it to a letter. This is the next letter in
120
- # the keystream. If the output card is a joker, no letter is generated
121
- # this sequence. This step does not alter the deck.
122
- def output_number
123
- i = @cards[0].to_i
124
- i -= @cards.length if i >= @cards.length
125
- num = @cards[i].to_i
126
- num -= 26 if num > 26
127
- num
128
- end
129
-
130
- def to_s
131
- @cards.join(' ')
132
- end
133
- end
134
-
135
- class CryptKeeper
136
-
137
- def initialize(deck)
138
- @keyed_deck = deck
139
- end
140
-
141
- def decrypt(str)
142
- @deck = @keyed_deck.dup
143
- answer = ""
144
- str.split(//).each { | c |
145
- if c == ' '
146
- answer << ' '
147
- next
148
- end
149
-
150
- msg_num = Card.chr_to_value(c)
151
- key = @deck.next_keystream
152
- diff = msg_num - key
153
- diff += 26 if diff < 1
154
- answer << Card.value_to_chr(diff)
155
- }
156
- answer
157
- end
158
-
159
- def encrypt(str)
160
- @deck = @keyed_deck.dup
161
- answer = ''
162
- str.split(//).each { | c |
163
- if c == ' '
164
- answer << ' '
165
- next
166
- end
167
-
168
- msg_num = Card.chr_to_value(c)
169
- key = @deck.next_keystream
170
- sum = msg_num + key
171
- sum -= 26 if sum > 26
172
- answer << Card.value_to_chr(sum)
173
- }
174
- answer
175
- end
176
-
177
- def crypto_each(str)
178
- @deck = @keyed_deck.dup
179
- str.split(//).each { | c | yield c }
180
- end
181
-
182
- end
183
-
184
- def prep_arg(str)
185
- str = str.upcase.gsub(/[^A-Z]/, '')
186
- words = []
187
- while str.length > 0
188
- words << str[0...5]
189
- str[0...5] = ''
190
- end
191
-
192
- last_len = words[words.length-1].length
193
- words[words.length-1] += ('X' * (5 - last_len)) if last_len < 5
194
- words.join(' ')
195
- end
196
-
197
- if __FILE__ == $0
198
- if ARGV[0]
199
- puts CryptKeeper.new(Deck.new.key).decrypt(prep_arg(ARGV[0]))
200
- else
201
- puts CryptKeeper.new(Deck.new.key).decrypt('CLEPK HHNIY CFPWH FDFEH')
202
- puts CryptKeeper.new(Deck.new.key).decrypt('ABVAW LWZSY OORYK DUPVH')
203
- end
204
- end
@@ -1,47 +0,0 @@
1
- #! /usr/bin/env ruby
2
-
3
- require 'test/unit.rb'
4
- require 'test/unit/ui/console/testrunner'
5
- require 'solitaire_cypher.rb'
6
-
7
- class SolitaireCypherTest < Test::Unit::TestCase
8
-
9
- KNOWN_PLAINTEXT = 'CODEI NRUBY LIVEL ONGER'
10
- KNOWN_CYPHER = 'GLNCQ MJAFF FVOMB JIYCB'
11
-
12
- def setup
13
- @deck = Deck.new.key
14
- @crypt_keeper = CryptKeeper.new(@deck)
15
- end
16
-
17
- def test_value_to_chr
18
- assert_equal('A', Card.value_to_chr(1))
19
- assert_equal('Z', Card.value_to_chr(26))
20
- end
21
-
22
- def test_chr_to_value
23
- assert_equal(1, Card.chr_to_value("A"))
24
- assert_equal(26, Card.chr_to_value("Z"))
25
- end
26
-
27
- def test_keystream
28
- expected = %w(D W J X H Y R F D G)
29
- deck = Deck.new.key
30
- expected.each { | exp |
31
- key = deck.next_keystream
32
- if exp != Card.value_to_chr(key)
33
- @errors << "expected #{exp}, key = #{Card.value_to_chr(key)}"
34
- end
35
- }
36
- end
37
-
38
- def test_decrypt_known_cypher
39
- assert_equal(KNOWN_PLAINTEXT, @crypt_keeper.decrypt(KNOWN_CYPHER))
40
- end
41
-
42
- def test_encrypt_known_message
43
- assert_equal(KNOWN_CYPHER, @crypt_keeper.encrypt(KNOWN_PLAINTEXT))
44
- end
45
- end
46
-
47
- Test::Unit::UI::Console::TestRunner.run(SolitaireCypherTest)
@@ -1,97 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'util'
3
- require 'deck'
4
-
5
- module Solitaire
6
- ASCII_OFFSET = 64
7
- ALPHABET_SIZE = 26
8
-
9
- class Chunker
10
- CHUNK_SIZE = 5
11
-
12
- def initialize(text)
13
- @legal_chars_only = text.gsub(/[^A-Za-z]/, "").upcase
14
- @legal_chars_only <<= "X" * (-@legal_chars_only.size % CHUNK_SIZE)
15
- raise "Nothing to chunk (non-alphabet characters removed): #{text}" if @legal_chars_only.size==0
16
- @chunks = []
17
- @number_chunks = []
18
- end
19
-
20
- def chunks
21
- @chunks if @chunks.size > 0
22
- @chunks = @legal_chars_only.gsub(/(.{#{CHUNK_SIZE}})/, '\1 ').rstrip.split(" ")
23
- end
24
-
25
- def number_chunks
26
- @number_chunks if @number_chunks.size > 0
27
- chunks.collect { |chunk| chunk.split("").collect { |char_string| char_string[0]-ASCII_OFFSET } }
28
- end
29
-
30
- def Chunker.to_letters(number_chunks)
31
- number_chunks.collect { |chunk| chunk.collect { |num| (num+ASCII_OFFSET).chr }.join }
32
- end
33
- end
34
-
35
- class Keystream
36
- A_JOKER = Card.joker(?A)
37
- B_JOKER = Card.joker(?B)
38
-
39
- def initialize(deck=Deck.new)
40
- @deck = deck
41
- end
42
-
43
- def keystream_letters(chunks)
44
- chunks.collect { |chunk| (1..chunk.size).collect { next_keystream_letter }.join }
45
- end
46
-
47
- def Keystream.card_to_letter(card)
48
- return "" if card.is_joker?
49
- (card.value.offset_mod(ALPHABET_SIZE)+ASCII_OFFSET).chr
50
- end
51
-
52
- private
53
-
54
- def next_keystream_letter
55
- process_deck
56
- top_card = @deck[0]
57
- keystream_card = @deck[top_card.value]
58
- letter = Keystream.card_to_letter(keystream_card)
59
- letter = next_keystream_letter if letter==""
60
- letter
61
- end
62
-
63
- def process_deck
64
- @deck.move_card!(A_JOKER, +1)
65
- @deck.move_card!(B_JOKER, +2)
66
- @deck.triple_cut!([A_JOKER, B_JOKER])
67
- @deck.count_cut!
68
- end
69
- end
70
-
71
- class Cipher
72
- ENCRYPTED_TEXT_PATTERN = /\A[A-Z]{5}( [A-Z]{5})*\Z/
73
-
74
- def initialize(text, deck=Deck.new)
75
- @chunker = Chunker.new(text)
76
- keystream = Keystream.new(deck)
77
- @keystream_chunker = Chunker.new(keystream.keystream_letters(@chunker.chunks).join)
78
- if text =~ ENCRYPTED_TEXT_PATTERN
79
- @mode = "decrypt"
80
- @calc_number = proc { |num, keystream_num| num - keystream_num }
81
- else
82
- @mode = "encrypt"
83
- @calc_number = proc { |num, keystream_num| num + keystream_num }
84
- end
85
- end
86
- attr_reader :mode
87
-
88
- def crypt
89
- ciphered = [@chunker.number_chunks, @keystream_chunker.number_chunks].collect_peel do |num_chunk, keystream_num_chunk|
90
- [num_chunk, keystream_num_chunk].collect_peel do |num, keystream_num|
91
- @calc_number.call(num,keystream_num).offset_mod(ALPHABET_SIZE)
92
- end
93
- end
94
- Chunker.to_letters(ciphered).join(" ").rstrip
95
- end
96
- end
97
- end
@@ -1,140 +0,0 @@
1
- require 'util'
2
-
3
- module Solitaire
4
- class Deck
5
- NUM_CARDS = 54
6
-
7
- def initialize(order=nil)
8
- if order.nil?
9
- @order = Array.new(NUM_CARDS) { |x| x+1 }
10
- else
11
- @order = order.collect { |val| val.instance_of?(Range) ? val.to_a : val }.flatten
12
- @order.collect! { |val| Card.parse(val).code }
13
- end
14
- end
15
- attr_reader :order
16
- protected :order
17
-
18
- def [](index)
19
- Card.parse(@order[index])
20
- end
21
-
22
- def move_card!(card, offset)
23
- current_index = @order.index(card.code)
24
- new_index = current_index+offset
25
- if new_index >= NUM_CARDS
26
- new_index -= NUM_CARDS - 1
27
- elsif new_index < 0
28
- new_index += NUM_CARDS - 1
29
- end
30
- @order.delete_at(current_index)
31
- @order.insert(new_index, card.code)
32
- end
33
-
34
- def triple_cut!(cards)
35
- raise "exactly two cards required for triple cut: #{cards}" unless cards.size==2
36
- indices = [@order.index(cards[0].code), @order.index(cards[1].code)].sort
37
- @order = @order[(indices[1]+1)..@order.size] + @order[indices[0]..indices[1]] + @order[0..(indices[0]-1)]
38
- end
39
-
40
- def count_cut!
41
- num_moved = Card.parse(@order.last).value
42
- if num_moved!=53
43
- @order = @order[num_moved, NUM_CARDS - num_moved - 1] + @order[0..(num_moved-1)] + [@order.last]
44
- end
45
- self
46
- end
47
-
48
- def to_s
49
- "<Deck: #{@order.inspect}>"
50
- end
51
-
52
- def ==(val)
53
- @order == val.order
54
- end
55
- end
56
-
57
- class Card
58
- ACE = 1
59
- JACK = 11
60
- QUEEN = 12
61
- KING = 13
62
-
63
- def initialize(suit, value)
64
- @code = suit.value + value
65
- end
66
- attr_reader :code
67
- alias_method :value, :code
68
-
69
- def Card.parse(code)
70
- if (1..52).member?(code)
71
- Card.new(Suit.by_value(code), code.offset_mod(13))
72
- elsif (53..54).member?(code)
73
- Card.joker(code+12)
74
- elsif (65..66).member?(code)
75
- Card.joker(code)
76
- elsif code =~ /\A[AB]\Z/
77
- Card.joker(code[0])
78
- else
79
- raise "Illegal class or value for parameter value, #{code.class} #{code.inspect}"
80
- end
81
- end
82
-
83
- def Card.joker(char)
84
- JokerCard.new(char.chr)
85
- end
86
-
87
- def is_joker?
88
- false
89
- end
90
-
91
- def ==(other)
92
- code==other.code
93
- end
94
-
95
- def <=>(other)
96
- code<=>other.code
97
- end
98
-
99
- def to_s
100
- "Card: #{@code}"
101
- end
102
- end
103
-
104
- class JokerCard < Card
105
- JOKER_VALUE = 53
106
-
107
- def initialize(which_one)
108
- raise "No such joker: #{which_one}" unless which_one =~ /\A[AB]\Z/
109
- @code = 52 + (which_one[0].to_i-64)
110
- end
111
-
112
- def is_joker?
113
- true
114
- end
115
-
116
- def value
117
- JOKER_VALUE
118
- end
119
- end
120
-
121
- class Suit
122
- @@byValue = {}
123
-
124
- def Suit.by_value(val)
125
- @@byValue[(val-1)/13*13]
126
- end
127
-
128
- def initialize(name, value)
129
- @name = name
130
- @value = value
131
- @@byValue[value] = self
132
- end
133
- attr_reader :name, :value
134
-
135
- CLUBS = Suit.new("clubs", 0)
136
- DIAMONDS = Suit.new("diamonds", 13)
137
- HEARTS = Suit.new("hearts", 26)
138
- SPADES = Suit.new("spades", 39)
139
- end
140
- end
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'cipher'
3
- require 'yaml'
4
-
5
- module Solitaire
6
- text = ARGV.join(" ")
7
- if FileTest::readable?("deck.yaml")
8
- deck = Deck.new(YAML::load(File.open("deck.yaml")))
9
- else
10
- deck = Deck.new
11
- end
12
- cipher = Cipher.new(text, deck)
13
- puts "#{cipher.mode}ed: #{cipher.crypt}"
14
- end
@@ -1,68 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'test/unit'
3
- require 'cipher'
4
-
5
- module Solitaire
6
- class TestChunker < Test::Unit::TestCase
7
- def test_chunks
8
- chunker = Chunker.new("Code in Ruby, live longer!")
9
- assert_equal(["CODEI","NRUBY","LIVEL","ONGER"], chunker.chunks)
10
- end
11
-
12
- def test_pads_with_Xs
13
- chunker = Chunker.new("sty")
14
- assert_equal(["STYXX"], chunker.chunks)
15
- end
16
-
17
- def test_number_chunks
18
- chunker = Chunker.new("Code in Ruby, live longer!")
19
- assert_equal([[3,15,4,5,9], [14,18,21,2,25], [12,9,22,5,12], [15,14,7,5,18]], chunker.number_chunks)
20
- end
21
-
22
- def test_to_letters
23
- assert_equal(["CODEI","NRUBY","LIVEL","ONGER"],
24
- Chunker.to_letters([[3,15,4,5,9], [14,18,21,2,25], [12,9,22,5,12], [15,14,7,5,18]]))
25
- end
26
- end
27
-
28
- class TestKeystream < Test::Unit::TestCase
29
- def setup
30
- @keystream = Keystream.new
31
- end
32
-
33
- def test_keystream_letters
34
- chunker = Chunker.new("Code in Ruby, live longer!")
35
- assert_equal(["DWJXH","YRFDG","TMSHP","UURXJ"], @keystream.keystream_letters(chunker.chunks))
36
- end
37
-
38
- def test_card_to_letter
39
- assert_equal("", Keystream.card_to_letter(Card.joker(?A)), "A joker")
40
- assert_equal("", Keystream.card_to_letter(Card.joker(?B)), "B joker")
41
- assert_equal("A", Keystream.card_to_letter(Card.new(Suit::CLUBS, Card::ACE)), "AC")
42
- assert_equal("Z", Keystream.card_to_letter(Card.new(Suit::DIAMONDS, Card::KING)), "KD")
43
- assert_equal("A", Keystream.card_to_letter(Card.new(Suit::HEARTS, Card::ACE)), "AH")
44
- assert_equal("Z", Keystream.card_to_letter(Card.new(Suit::SPADES, Card::KING)), "KS")
45
- end
46
- end
47
-
48
- class TestCipher < Test::Unit::TestCase
49
- def test_encrypt
50
- cipher = Cipher.new("Code in Ruby, live longer!")
51
- assert_equal("encrypt", cipher.mode)
52
- assert_equal("GLNCQ MJAFF FVOMB JIYCB", cipher.crypt)
53
- end
54
-
55
- def test_decrypt
56
- cipher = Cipher.new("GLNCQ MJAFF FVOMB JIYCB")
57
- assert_equal("decrypt", cipher.mode)
58
- assert_equal("CODEI NRUBY LIVEL ONGER", cipher.crypt)
59
- end
60
-
61
- def test_crypt_idempotent
62
- cipher = Cipher.new("GLNCQ MJAFF FVOMB JIYCB")
63
- assert_equal("decrypt", cipher.mode)
64
- assert_equal("CODEI NRUBY LIVEL ONGER", cipher.crypt)
65
- assert_equal("CODEI NRUBY LIVEL ONGER", cipher.crypt)
66
- end
67
- end
68
- end
@@ -1,146 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'test/unit'
3
- require 'deck'
4
-
5
- module Solitaire
6
- class TestDeck < Test::Unit::TestCase
7
- def test_constructor_accepts_ranges_in_array
8
- assert_equal(Deck.new, Deck.new([1, 2, 3, 4..52, 53..54]))
9
- end
10
-
11
- def test_construcor_accepts_chars_for_jokers
12
- assert_equal(Deck.new, Deck.new((1..52).to_a + [?A, ?B]))
13
- end
14
-
15
- def test_move_card_lower
16
- deck = Deck.new
17
- deck.move_card!(Card.new(Suit::DIAMONDS, 6), +5)
18
- assert_equal(Deck.new([1..18,20..24,19,25..54]).to_s, deck.to_s)
19
- end
20
-
21
- def test_move_card_one_lower
22
- deck = Deck.new
23
- deck.move_card!(Card.new(Suit::DIAMONDS, 6), +1)
24
- assert_equal(Deck.new([1..18,20,19,21..54]).to_s, deck.to_s)
25
- end
26
-
27
- def test_move_card_higher
28
- deck = Deck.new
29
- deck.move_card!(Card.new(Suit::DIAMONDS, 6), -5)
30
- assert_equal(Deck.new([1..13,19,14..18,20..54]), deck)
31
- end
32
-
33
- def test_move_card_is_cyclic_plus_1
34
- deck = Deck.new
35
- deck.move_card!(Card.joker(?A), +2)
36
- assert_equal(Deck.new([1,53,2..52,54]), deck)
37
- end
38
-
39
- def test_move_card_to_end
40
- deck = Deck.new
41
- deck.move_card!(Card.joker(?A), +1)
42
- assert_equal(Deck.new([1..52,54,53]), deck)
43
- end
44
-
45
- def test_move_card_to_one_before_end
46
- deck = Deck.new([2..54,1])
47
- deck.move_card!(Card.joker(?A), +1)
48
- assert_equal(Deck.new([2..52,54,53,1]).to_s, deck.to_s)
49
- end
50
-
51
- def test_move_card_to_beginning
52
- deck = Deck.new
53
- deck.move_card!(Card.new(Suit::CLUBS, 2), -1)
54
- assert_equal(Deck.new([2,1,3..54]), deck)
55
- end
56
-
57
- def test_move_card_is_cyclic_pass_end_forward
58
- deck = Deck.new
59
- deck.move_card!(Card.joker(?B), +1)
60
- assert_equal(Deck.new([1,54,2..53]), deck)
61
- end
62
-
63
- def test_move_card_is_cyclic_pass_end_backward
64
- deck = Deck.new
65
- deck.move_card!(Card.new(Suit::CLUBS, Card::ACE), -1)
66
- assert_equal(Deck.new([2..53,1,54]), deck)
67
- end
68
-
69
- def test_move_card_cyclic_backward_five
70
- deck = Deck.new
71
- deck.move_card!(Card.new(Suit::CLUBS, 5), -5)
72
- assert_equal(Deck.new([1..4,6..53,5,54]), deck)
73
- end
74
-
75
- def test_triple_cut
76
- deck = Deck.new
77
- deck.triple_cut!([Card.new(Suit::CLUBS, Card::JACK), Card.new(Suit::HEARTS, Card::KING)])
78
- assert_equal(Deck.new([40..54,11..39,1..10]), deck)
79
- end
80
-
81
- def test_triple_cut_with_empty_side
82
- deck = Deck.new([2..53,1,54])
83
- deck.triple_cut!([Card.joker(?A), Card.joker(?B)])
84
- assert_equal(Deck.new([53,1,54,2..52]), deck)
85
- end
86
-
87
- def test_count_cut
88
- deck = Deck.new
89
- deck.move_card!(Card.new(Suit::CLUBS, 5), 49)
90
- deck.count_cut!
91
- assert_equal(Deck.new([7..54,1..4,6,5]), deck)
92
- end
93
- end
94
-
95
- class TestCard < Test::Unit::TestCase
96
- def test_parse_joker_string
97
- assert_equal(Card.joker(?A), Card.parse("A"))
98
- end
99
-
100
- def test_parse_joker_char
101
- assert_equal(Card.joker(?A), Card.parse(?A))
102
- end
103
-
104
- def test_parse_normal_card
105
- assert_equal(Card.new(Suit::CLUBS, 5), Card.parse(5))
106
- end
107
-
108
- def test_value
109
- assert_equal(1, Card.new(Suit::CLUBS, Card::ACE).value, "AC")
110
- assert_equal(7, Card.new(Suit::CLUBS, 7).value, "7C")
111
- assert_equal(11, Card.new(Suit::CLUBS, Card::JACK).value, "JC")
112
- assert_equal(13, Card.new(Suit::CLUBS, Card::KING).value, "KC")
113
- assert_equal(14, Card.new(Suit::DIAMONDS, Card::ACE).value, "AD")
114
- assert_equal(26, Card.new(Suit::DIAMONDS, Card::KING).value, "KD")
115
- assert_equal(29, Card.new(Suit::HEARTS, 3).value, "3H")
116
- assert_equal(39, Card.new(Suit::HEARTS, Card::KING).value, "KH")
117
- assert_equal(40, Card.new(Suit::SPADES, Card::ACE).value, "AS")
118
- assert_equal(52, Card.new(Suit::SPADES, Card::KING).value, "KS")
119
- assert_equal(53, Card.joker(?A).value, "A Joker")
120
- assert_equal(53, Card.joker(?B).value, "B Joker")
121
- end
122
-
123
- def test_is_joker_when_joker
124
- assert(Card.joker(?A).is_joker?, "A joker not joker")
125
- assert(Card.joker(?B).is_joker?, "B joker not joker")
126
- end
127
-
128
- def test_is_joker_when_not_joker
129
- assert(!Card.new(Suit::SPADES, 7).is_joker?)
130
- end
131
- end
132
-
133
- class TestSuit < Test::Unit::TestCase
134
- def test_by_value_clubs
135
- assert_equal("clubs", Suit.by_value(1).name)
136
- end
137
-
138
- def test_by_value_hearts
139
- assert_equal("hearts", Suit.by_value(27).name)
140
- end
141
-
142
- def test_hearts
143
- assert_equal("hearts", Suit::HEARTS.name)
144
- end
145
- end
146
- end