pnm 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -5
- data/Rakefile +1 -1
- data/benchmark/bm_converter.rb +1 -1
- data/lib/pnm.rb +2 -2
- data/lib/pnm/converter.rb +2 -2
- data/lib/pnm/parser.rb +18 -11
- data/lib/pnm/version.rb +2 -2
- data/test/backports.rb +19 -0
- data/test/test_converter.rb +29 -27
- data/test/test_exceptions.rb +47 -45
- data/test/test_image.rb +62 -60
- data/test/test_parser.rb +13 -11
- data/test/test_pnm.rb +45 -43
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a3dd7ccd09f9d5a2f16212910e8aba16f25c78648e965c42847a86bc057632e
|
4
|
+
data.tar.gz: 7f22c53142d2317692fa2e840a6b12758e39990123c1d297d9624abc26a71c4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7ca3afc52aac295f564ecb5222c1339ce9ae623db0213ee7c878d05591396d735a76e0a19d62acce0cb095802352ebd1f1442ea4a803c32aa2bc4d8bf169289
|
7
|
+
data.tar.gz: '08e3653dd113aabd4333c789a4077b95733a18f3422db4e6006e7f534692f365f35474791dfb6d8c66716bb5c6e16ced1f07e2fbf7b36e6ba2842a09911c00b1'
|
data/README.md
CHANGED
@@ -98,10 +98,9 @@ Requirements
|
|
98
98
|
|
99
99
|
- PNM has been tested with
|
100
100
|
|
101
|
-
- Ruby 2.
|
102
|
-
- Ruby 2.0.0,
|
103
|
-
-
|
104
|
-
- JRuby 1.7.19,
|
101
|
+
- Ruby 2.7
|
102
|
+
- Ruby 2.6, 2.5, 2.4, 2.3, 2.2, 2.1, 2.0.0, 1.9.3,
|
103
|
+
- JRuby 9.2.9.0,
|
105
104
|
- Rubinius 2.5.2.
|
106
105
|
|
107
106
|
Documentation
|
@@ -118,7 +117,7 @@ Report bugs on the PNM home page: <https://github.com/stomar/pnm/>
|
|
118
117
|
License
|
119
118
|
-------
|
120
119
|
|
121
|
-
Copyright © 2013-
|
120
|
+
Copyright © 2013-2020 Marcus Stollsteimer
|
122
121
|
|
123
122
|
`PNM` is free software: you can redistribute it and/or modify
|
124
123
|
it under the terms of the GNU General Public License version 3 or later (GPLv3+),
|
data/Rakefile
CHANGED
data/benchmark/bm_converter.rb
CHANGED
data/lib/pnm.rb
CHANGED
@@ -87,7 +87,7 @@ require_relative "pnm/exceptions"
|
|
87
87
|
#
|
88
88
|
# == Author
|
89
89
|
#
|
90
|
-
# Copyright (C) 2013-
|
90
|
+
# Copyright (C) 2013-2020 Marcus Stollsteimer
|
91
91
|
#
|
92
92
|
# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
93
93
|
#
|
@@ -98,7 +98,7 @@ module PNM
|
|
98
98
|
TAGLINE = "create/read/write PNM image files (PBM, PGM, PPM)"
|
99
99
|
|
100
100
|
COPYRIGHT = <<-TEXT.gsub(/^ +/, "")
|
101
|
-
Copyright (C) 2013-
|
101
|
+
Copyright (C) 2013-2020 Marcus Stollsteimer.
|
102
102
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
|
103
103
|
This is free software: you are free to change and redistribute it.
|
104
104
|
There is NO WARRANTY, to the extent permitted by law.
|
data/lib/pnm/converter.rb
CHANGED
@@ -113,8 +113,8 @@ module PNM
|
|
113
113
|
end
|
114
114
|
|
115
115
|
values_as_string.map {|value| Integer(value) }
|
116
|
-
rescue ::ArgumentError =>
|
117
|
-
raise unless
|
116
|
+
rescue ::ArgumentError => e
|
117
|
+
raise unless e.message.start_with?("invalid value for Integer")
|
118
118
|
|
119
119
|
raise PNM::DataError, "invalid pixel value: Integer expected"
|
120
120
|
end
|
data/lib/pnm/parser.rb
CHANGED
@@ -22,7 +22,7 @@ module PNM
|
|
22
22
|
content = content.dup
|
23
23
|
|
24
24
|
magic_number = nil
|
25
|
-
tokens
|
25
|
+
tokens = []
|
26
26
|
comments = []
|
27
27
|
|
28
28
|
until magic_number
|
@@ -50,17 +50,17 @@ module PNM
|
|
50
50
|
|
51
51
|
width, height, maxgray = tokens
|
52
52
|
|
53
|
-
assert_integer(width,
|
54
|
-
assert_integer(height,
|
53
|
+
assert_integer(width, "width")
|
54
|
+
assert_integer(height, "height")
|
55
55
|
assert_integer(maxgray, "maxgray") if maxgray
|
56
56
|
|
57
|
-
width
|
58
|
-
height
|
57
|
+
width = width.to_i
|
58
|
+
height = height.to_i
|
59
59
|
maxgray = maxgray.to_i if maxgray
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
assert_positive(width, "width")
|
62
|
+
assert_positive(height, "height")
|
63
|
+
assert_in_maxgray_range(maxgray) if maxgray
|
64
64
|
|
65
65
|
result = {
|
66
66
|
magic_number: magic_number,
|
@@ -114,10 +114,17 @@ module PNM
|
|
114
114
|
raise PNM::ParserError, msg
|
115
115
|
end
|
116
116
|
|
117
|
-
def self.
|
118
|
-
return if
|
117
|
+
def self.assert_positive(value, name)
|
118
|
+
return if value > 0
|
119
119
|
|
120
|
-
msg = "
|
120
|
+
msg = "#{name} must be greater than 0 - `#{value}'"
|
121
|
+
raise PNM::ParserError, msg
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.assert_in_maxgray_range(value)
|
125
|
+
return if value > 0 && value <= 255
|
126
|
+
|
127
|
+
msg = "invalid maxgray value - `#{value}'"
|
121
128
|
raise PNM::ParserError, msg
|
122
129
|
end
|
123
130
|
end
|
data/lib/pnm/version.rb
CHANGED
data/test/backports.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PNM
|
4
|
+
module Backports # :nodoc:
|
5
|
+
module Minitest # :nodoc:
|
6
|
+
|
7
|
+
# Provides workaround for missing value wrappers in minitest < 5.6.0.
|
8
|
+
def _(value = nil, &block)
|
9
|
+
block || value
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
if Gem.loaded_specs["minitest"].version < Gem::Version.new("5.6.0")
|
17
|
+
warn "Using workaround for missing value wrappers in minitest < 5.6.0."
|
18
|
+
include PNM::Backports::Minitest
|
19
|
+
end
|
data/test/test_converter.rb
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
# test_converter.rb: Unit tests for the PNM library.
|
4
4
|
#
|
5
|
-
# Copyright (C) 2013-
|
5
|
+
# Copyright (C) 2013-2020 Marcus Stollsteimer
|
6
6
|
|
7
7
|
require "minitest/autorun"
|
8
8
|
require "pnm/converter"
|
9
9
|
|
10
|
+
require_relative "backports"
|
11
|
+
|
10
12
|
|
11
13
|
describe PNM::Converter do
|
12
14
|
|
@@ -56,7 +58,7 @@ describe PNM::Converter do
|
|
56
58
|
data = @pbm[:ascii]
|
57
59
|
expected = @pbm[:array]
|
58
60
|
|
59
|
-
@converter.ascii2array(:pbm, width, height, data).must_equal expected
|
61
|
+
_(@converter.ascii2array(:pbm, width, height, data)).must_equal expected
|
60
62
|
end
|
61
63
|
|
62
64
|
it "can convert from ASCII encoded PGM data" do
|
@@ -65,7 +67,7 @@ describe PNM::Converter do
|
|
65
67
|
data = @pgm[:ascii]
|
66
68
|
expected = @pgm[:array]
|
67
69
|
|
68
|
-
@converter.ascii2array(:pgm, width, height, data).must_equal expected
|
70
|
+
_(@converter.ascii2array(:pgm, width, height, data)).must_equal expected
|
69
71
|
end
|
70
72
|
|
71
73
|
it "can convert from ASCII encoded PPM data" do
|
@@ -74,7 +76,7 @@ describe PNM::Converter do
|
|
74
76
|
data = @ppm[:ascii]
|
75
77
|
expected = @ppm[:array]
|
76
78
|
|
77
|
-
@converter.ascii2array(:ppm, width, height, data).must_equal expected
|
79
|
+
_(@converter.ascii2array(:ppm, width, height, data)).must_equal expected
|
78
80
|
end
|
79
81
|
|
80
82
|
it "accepts ASCII encoded PBM data with omitted whitespace" do
|
@@ -83,7 +85,7 @@ describe PNM::Converter do
|
|
83
85
|
data = " 010100\n000110"
|
84
86
|
expected = [[0, 1, 0, 1], [0, 0, 0, 0], [0, 1, 1, 0]]
|
85
87
|
|
86
|
-
@converter.ascii2array(:pbm, width, height, data).must_equal expected
|
88
|
+
_(@converter.ascii2array(:pbm, width, height, data)).must_equal expected
|
87
89
|
end
|
88
90
|
|
89
91
|
it "accepts ASCII encoded PGM data with arbitrary whitespace" do
|
@@ -92,7 +94,7 @@ describe PNM::Converter do
|
|
92
94
|
data = " \n 10 90\t170\r250\n90 \t170 250 \t\r\n\t 10\n\n\n170\n250\n10\n90\n"
|
93
95
|
expected = [[10, 90, 170, 250], [90, 170, 250, 10], [170, 250, 10, 90]]
|
94
96
|
|
95
|
-
@converter.ascii2array(:pgm, width, height, data).must_equal expected
|
97
|
+
_(@converter.ascii2array(:pgm, width, height, data)).must_equal expected
|
96
98
|
end
|
97
99
|
|
98
100
|
it "can convert from binary encoded PBM data (width 6)" do
|
@@ -101,7 +103,7 @@ describe PNM::Converter do
|
|
101
103
|
data = @pbm6[:binary]
|
102
104
|
expected = @pbm6[:array]
|
103
105
|
|
104
|
-
@converter.binary2array(:pbm, width, height, data).must_equal expected
|
106
|
+
_(@converter.binary2array(:pbm, width, height, data)).must_equal expected
|
105
107
|
end
|
106
108
|
|
107
109
|
it "can convert from binary encoded PBM data (width 14)" do
|
@@ -110,7 +112,7 @@ describe PNM::Converter do
|
|
110
112
|
data = @pbm14[:binary]
|
111
113
|
expected = @pbm14[:array]
|
112
114
|
|
113
|
-
@converter.binary2array(:pbm, width, height, data).must_equal expected
|
115
|
+
_(@converter.binary2array(:pbm, width, height, data)).must_equal expected
|
114
116
|
end
|
115
117
|
|
116
118
|
it "can convert from binary encoded PGM data" do
|
@@ -119,7 +121,7 @@ describe PNM::Converter do
|
|
119
121
|
data = @pgm[:binary]
|
120
122
|
expected = @pgm[:array]
|
121
123
|
|
122
|
-
@converter.binary2array(:pgm, width, height, data).must_equal expected
|
124
|
+
_(@converter.binary2array(:pgm, width, height, data)).must_equal expected
|
123
125
|
end
|
124
126
|
|
125
127
|
it "can convert from binary encoded PPM data" do
|
@@ -128,7 +130,7 @@ describe PNM::Converter do
|
|
128
130
|
data = @ppm[:binary]
|
129
131
|
expected = @ppm[:array]
|
130
132
|
|
131
|
-
@converter.binary2array(:ppm, width, height, data).must_equal expected
|
133
|
+
_(@converter.binary2array(:ppm, width, height, data)).must_equal expected
|
132
134
|
end
|
133
135
|
|
134
136
|
it "accepts an additional whitespace character for binary encoded data" do
|
@@ -137,73 +139,73 @@ describe PNM::Converter do
|
|
137
139
|
data = @pbm14[:binary] + "\t"
|
138
140
|
expected = @pbm14[:array]
|
139
141
|
|
140
|
-
@converter.binary2array(:pbm, width, height, data).must_equal expected
|
142
|
+
_(@converter.binary2array(:pbm, width, height, data)).must_equal expected
|
141
143
|
end
|
142
144
|
|
143
145
|
it "can convert to ASCII encoded PBM data" do
|
144
146
|
data = @pbm[:array]
|
145
147
|
expected = @pbm[:ascii]
|
146
148
|
|
147
|
-
@converter.array2ascii(data).must_equal expected
|
149
|
+
_(@converter.array2ascii(data)).must_equal expected
|
148
150
|
end
|
149
151
|
|
150
152
|
it "can convert to ASCII encoded PGM data" do
|
151
153
|
data = @pgm[:array]
|
152
154
|
expected = @pgm[:ascii]
|
153
155
|
|
154
|
-
@converter.array2ascii(data).must_equal expected
|
156
|
+
_(@converter.array2ascii(data)).must_equal expected
|
155
157
|
end
|
156
158
|
|
157
159
|
it "can convert to ASCII encoded PPM data" do
|
158
160
|
data = @ppm[:array]
|
159
161
|
expected = @ppm[:ascii]
|
160
162
|
|
161
|
-
@converter.array2ascii(data).must_equal expected
|
163
|
+
_(@converter.array2ascii(data)).must_equal expected
|
162
164
|
end
|
163
165
|
|
164
166
|
it "can convert to binary encoded PBM data (width 6)" do
|
165
167
|
data = @pbm6[:array]
|
166
168
|
expected = @pbm6[:binary]
|
167
169
|
|
168
|
-
@converter.array2binary(:pbm, data).must_equal expected
|
170
|
+
_(@converter.array2binary(:pbm, data)).must_equal expected
|
169
171
|
end
|
170
172
|
|
171
173
|
it "can convert to binary encoded PBM data (width 14)" do
|
172
174
|
data = @pbm14[:array]
|
173
175
|
expected = @pbm14[:binary]
|
174
176
|
|
175
|
-
@converter.array2binary(:pbm, data).must_equal expected
|
177
|
+
_(@converter.array2binary(:pbm, data)).must_equal expected
|
176
178
|
end
|
177
179
|
|
178
180
|
it "can convert to binary encoded PGM data" do
|
179
181
|
data = @pgm[:array]
|
180
182
|
expected = @pgm[:binary]
|
181
183
|
|
182
|
-
@converter.array2binary(:pgm, data).must_equal expected
|
184
|
+
_(@converter.array2binary(:pgm, data)).must_equal expected
|
183
185
|
end
|
184
186
|
|
185
187
|
it "can convert to binary encoded PPM data" do
|
186
188
|
data = @ppm[:array]
|
187
189
|
expected = @ppm[:binary]
|
188
190
|
|
189
|
-
@converter.array2binary(:ppm, data).must_equal expected
|
191
|
+
_(@converter.array2binary(:ppm, data)).must_equal expected
|
190
192
|
end
|
191
193
|
|
192
194
|
it "can calculate correct byte widths for a PBM image" do
|
193
|
-
@converter.byte_width(:pbm, 0).must_equal 0
|
194
|
-
@converter.byte_width(:pbm, 1).must_equal 1
|
195
|
-
@converter.byte_width(:pbm, 7).must_equal 1
|
196
|
-
@converter.byte_width(:pbm, 8).must_equal 1
|
197
|
-
@converter.byte_width(:pbm, 9).must_equal 2
|
198
|
-
@converter.byte_width(:pbm, 64).must_equal 8
|
199
|
-
@converter.byte_width(:pbm, 65).must_equal 9
|
195
|
+
_(@converter.byte_width(:pbm, 0)).must_equal 0
|
196
|
+
_(@converter.byte_width(:pbm, 1)).must_equal 1
|
197
|
+
_(@converter.byte_width(:pbm, 7)).must_equal 1
|
198
|
+
_(@converter.byte_width(:pbm, 8)).must_equal 1
|
199
|
+
_(@converter.byte_width(:pbm, 9)).must_equal 2
|
200
|
+
_(@converter.byte_width(:pbm, 64)).must_equal 8
|
201
|
+
_(@converter.byte_width(:pbm, 65)).must_equal 9
|
200
202
|
end
|
201
203
|
|
202
204
|
it "can calculate correct byte widths for a PGM image" do
|
203
|
-
@converter.byte_width(:pgm, 13).must_equal 13
|
205
|
+
_(@converter.byte_width(:pgm, 13)).must_equal 13
|
204
206
|
end
|
205
207
|
|
206
208
|
it "can calculate correct byte widths for a PPM image" do
|
207
|
-
@converter.byte_width(:ppm, 13).must_equal 39
|
209
|
+
_(@converter.byte_width(:ppm, 13)).must_equal 39
|
208
210
|
end
|
209
211
|
end
|
data/test/test_exceptions.rb
CHANGED
@@ -2,123 +2,125 @@
|
|
2
2
|
|
3
3
|
# test_exceptions.rb: Unit tests for the PNM library.
|
4
4
|
#
|
5
|
-
# Copyright (C) 2013-
|
5
|
+
# Copyright (C) 2013-2020 Marcus Stollsteimer
|
6
6
|
|
7
7
|
require "minitest/autorun"
|
8
8
|
require "stringio"
|
9
9
|
require "pnm"
|
10
10
|
|
11
|
+
require_relative "backports"
|
12
|
+
|
11
13
|
|
12
14
|
describe "PNM.create" do
|
13
15
|
|
14
16
|
it "raises an exception for invalid data type (String)" do
|
15
17
|
data = "0"
|
16
|
-
|
18
|
+
_ { PNM.create(data) }.must_raise PNM::ArgumentError
|
17
19
|
end
|
18
20
|
|
19
21
|
it "raises an exception for invalid type" do
|
20
22
|
data = [[0, 0], [0, 0]]
|
21
|
-
|
23
|
+
_ { PNM.create(data, type: :abc) }.must_raise PNM::ArgumentError
|
22
24
|
end
|
23
25
|
|
24
26
|
it "raises an exception for invalid maxgray (String)" do
|
25
27
|
data = [[0, 0], [0, 0]]
|
26
|
-
|
28
|
+
_ { PNM.create(data, maxgray: "255") }.must_raise PNM::ArgumentError
|
27
29
|
end
|
28
30
|
|
29
31
|
it "raises an exception for invalid maxgray (> 255)" do
|
30
32
|
data = [[0, 0], [0, 0]]
|
31
|
-
|
33
|
+
_ { PNM.create(data, maxgray: 256) }.must_raise PNM::ArgumentError
|
32
34
|
end
|
33
35
|
|
34
36
|
it "raises an exception for invalid maxgray (0)" do
|
35
37
|
data = [[0, 0], [0, 0]]
|
36
|
-
|
38
|
+
_ { PNM.create(data, maxgray: 0) }.must_raise PNM::ArgumentError
|
37
39
|
end
|
38
40
|
|
39
41
|
it "raises an exception for invalid comment (Integer)" do
|
40
42
|
data = [[0, 0], [0, 0]]
|
41
|
-
|
43
|
+
_ { PNM.create(data, comment: 1) }.must_raise PNM::ArgumentError
|
42
44
|
end
|
43
45
|
|
44
46
|
it "raises an exception for image type and data mismatch (PBM)" do
|
45
47
|
data = [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]
|
46
|
-
|
48
|
+
_ { PNM.create(data, type: :pbm) }.must_raise PNM::DataError
|
47
49
|
end
|
48
50
|
|
49
51
|
it "raises an exception for image type and data mismatch (PGM)" do
|
50
52
|
data = [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]
|
51
|
-
|
53
|
+
_ { PNM.create(data, type: :pgm) }.must_raise PNM::DataError
|
52
54
|
end
|
53
55
|
|
54
56
|
it "raises an exception for non-integer pixel value (String)" do
|
55
57
|
data = [[0, 0], ["X", 0]]
|
56
|
-
|
58
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
57
59
|
end
|
58
60
|
|
59
61
|
it "raises an exception for non-integer pixel value (Float)" do
|
60
62
|
data = [[0, 0], [0.5, 0]]
|
61
|
-
|
63
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
62
64
|
end
|
63
65
|
|
64
66
|
it "raises an exception for rows of different size" do
|
65
67
|
data = [[0, 0], [0, 0, 0]]
|
66
|
-
|
68
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
67
69
|
end
|
68
70
|
|
69
71
|
it "raises an exception for invalid array dimensions (#1)" do
|
70
72
|
data = [0, 0, 0]
|
71
|
-
|
73
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
72
74
|
end
|
73
75
|
|
74
76
|
it "raises an exception for invalid array dimensions (#2)" do
|
75
77
|
data = [[0, 0], 0, 0]
|
76
|
-
|
78
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
77
79
|
end
|
78
80
|
|
79
81
|
it "raises an exception for invalid array dimensions (#3)" do
|
80
82
|
data = [[0, 0], [0, [0, 0]]]
|
81
|
-
|
83
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
82
84
|
end
|
83
85
|
|
84
86
|
it "raises an exception for invalid array dimensions (#4)" do
|
85
87
|
data = [[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
|
86
|
-
|
88
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
87
89
|
end
|
88
90
|
|
89
91
|
it "raises an exception for invalid array dimensions (#5)" do
|
90
92
|
data = [[[0, 0, 0], [0, 0, 0]], [0, 0]]
|
91
|
-
|
93
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
92
94
|
end
|
93
95
|
|
94
96
|
it "raises an exception for invalid array dimensions (#6)" do
|
95
97
|
data = [[[0, 0, 0], 0], [0, 0]]
|
96
|
-
|
98
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
97
99
|
end
|
98
100
|
|
99
101
|
it "raises an exception for an empty array" do
|
100
102
|
data = [[]]
|
101
|
-
|
103
|
+
_ { PNM.create(data) }.must_raise PNM::DataError
|
102
104
|
end
|
103
105
|
|
104
106
|
it "raises an exception for invalid PBM data (> 1)" do
|
105
107
|
data = [[0, 0], [2, 0]]
|
106
|
-
|
108
|
+
_ { PNM.create(data, type: :pbm) }.must_raise PNM::DataError
|
107
109
|
end
|
108
110
|
|
109
111
|
it "raises an exception for invalid PBM data (< 0)" do
|
110
112
|
data = [[0, 0], [-1, 0]]
|
111
|
-
|
113
|
+
_ { PNM.create(data, type: :pbm) }.must_raise PNM::DataError
|
112
114
|
end
|
113
115
|
|
114
116
|
it "raises an exception for invalid PGM data (> 255)" do
|
115
117
|
data = [[0, 0], [1, 500]]
|
116
|
-
|
118
|
+
_ { PNM.create(data, type: :pgm) }.must_raise PNM::DataError
|
117
119
|
end
|
118
120
|
|
119
121
|
it "raises an exception for invalid PGM data (> maxgray)" do
|
120
122
|
data = [[0, 0], [1, 200]]
|
121
|
-
|
123
|
+
_ { PNM.create(data, maxgray: 100) }.must_raise PNM::DataError
|
122
124
|
end
|
123
125
|
end
|
124
126
|
|
@@ -126,111 +128,111 @@ end
|
|
126
128
|
describe "PNM.read" do
|
127
129
|
|
128
130
|
it "raises an exception for integer argument" do
|
129
|
-
|
131
|
+
_ { PNM.read(123) }.must_raise PNM::ArgumentError
|
130
132
|
end
|
131
133
|
|
132
134
|
it "raises an exception for unknown magic number" do
|
133
135
|
file = StringIO.new("P0 1 1 0")
|
134
|
-
|
136
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
135
137
|
end
|
136
138
|
|
137
139
|
it "raises an exception for an empty file" do
|
138
140
|
file = StringIO.new("")
|
139
|
-
|
141
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
140
142
|
end
|
141
143
|
|
142
144
|
it "raises an exception for missing tokens (#1)" do
|
143
145
|
file = StringIO.new("P1")
|
144
|
-
|
146
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
145
147
|
end
|
146
148
|
|
147
149
|
it "raises an exception for missing tokens (#2)" do
|
148
150
|
file = StringIO.new("P1 1")
|
149
|
-
|
151
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
150
152
|
end
|
151
153
|
|
152
154
|
it "raises an exception for missing tokens (#3)" do
|
153
155
|
file = StringIO.new("P1 1 ")
|
154
|
-
|
156
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
155
157
|
end
|
156
158
|
|
157
159
|
it "raises an exception for missing tokens (#4)" do
|
158
160
|
file = StringIO.new("P1 1 1")
|
159
|
-
|
161
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
160
162
|
end
|
161
163
|
|
162
164
|
it "raises an exception for missing tokens (#5)" do
|
163
165
|
file = StringIO.new("P1 1 # Test\n 1")
|
164
|
-
|
166
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
165
167
|
end
|
166
168
|
|
167
169
|
it "raises an exception for missing tokens (#6)" do
|
168
170
|
file = StringIO.new("P2 1 1 255")
|
169
|
-
|
171
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
170
172
|
end
|
171
173
|
|
172
174
|
it "raises an exception for token of wrong type (#1)" do
|
173
175
|
file = StringIO.new("P1 ? 1 0")
|
174
|
-
|
176
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
175
177
|
end
|
176
178
|
|
177
179
|
it "raises an exception for token of wrong type (#2)" do
|
178
180
|
file = StringIO.new("P1 1 X 0")
|
179
|
-
|
181
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
180
182
|
end
|
181
183
|
|
182
184
|
it "raises an exception for token of wrong type (#3)" do
|
183
185
|
file = StringIO.new("P2 1 1 foo 0")
|
184
|
-
|
186
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
185
187
|
end
|
186
188
|
|
187
189
|
it "raises an exception for zero width" do
|
188
190
|
file = StringIO.new("P2 0 1 255 0")
|
189
|
-
|
191
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
190
192
|
end
|
191
193
|
|
192
194
|
it "raises an exception for zero height" do
|
193
195
|
file = StringIO.new("P2 1 0 255 0")
|
194
|
-
|
196
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
195
197
|
end
|
196
198
|
|
197
199
|
it "raises an exception for invalid maxgray (> 255)" do
|
198
200
|
file = StringIO.new("P2 1 1 256 0")
|
199
|
-
|
201
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
200
202
|
end
|
201
203
|
|
202
204
|
it "raises an exception for invalid maxgray (0)" do
|
203
205
|
file = StringIO.new("P2 1 1 0 0")
|
204
|
-
|
206
|
+
_ { PNM.read(file) }.must_raise PNM::ParserError
|
205
207
|
end
|
206
208
|
|
207
209
|
it "raises an exception for image dimension mismatch (#1)" do
|
208
210
|
file = StringIO.new("P1 2 3 0 0 0 0 0")
|
209
|
-
|
211
|
+
_ { PNM.read(file) }.must_raise PNM::DataSizeError
|
210
212
|
end
|
211
213
|
|
212
214
|
it "raises an exception for image dimension mismatch (#2)" do
|
213
215
|
file = StringIO.new("P1 2 3 0 0 0 0 0 0 0")
|
214
|
-
|
216
|
+
_ { PNM.read(file) }.must_raise PNM::DataSizeError
|
215
217
|
end
|
216
218
|
|
217
219
|
it "raises an exception for image dimension mismatch (#3)" do
|
218
220
|
file = StringIO.new("P3 2 3 255 0 0 0 0 0 0")
|
219
|
-
|
221
|
+
_ { PNM.read(file) }.must_raise PNM::DataSizeError
|
220
222
|
end
|
221
223
|
|
222
224
|
it "raises an exception for image dimension mismatch (#4)" do
|
223
225
|
file = StringIO.new("P5 2 3 255 AAAAAAA")
|
224
|
-
|
226
|
+
_ { PNM.read(file) }.must_raise PNM::DataSizeError
|
225
227
|
end
|
226
228
|
|
227
229
|
it "raises an exception for image dimension mismatch (#5)" do
|
228
230
|
file = StringIO.new("P5 2 3 255 AAAAAAA")
|
229
|
-
|
231
|
+
_ { PNM.read(file) }.must_raise PNM::DataSizeError
|
230
232
|
end
|
231
233
|
|
232
234
|
it "raises an exception for non-numeric image data" do
|
233
235
|
file = StringIO.new("P1 2 3 0 X 0 0 0 0")
|
234
|
-
|
236
|
+
_ { PNM.read(file) }.must_raise PNM::DataError
|
235
237
|
end
|
236
238
|
end
|
data/test/test_image.rb
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
# test_image.rb: Unit tests for the PNM library.
|
4
4
|
#
|
5
|
-
# Copyright (C) 2013-
|
5
|
+
# Copyright (C) 2013-2020 Marcus Stollsteimer
|
6
6
|
|
7
7
|
require "minitest/autorun"
|
8
8
|
require "pnm"
|
9
9
|
|
10
|
+
require_relative "backports"
|
11
|
+
|
10
12
|
|
11
13
|
describe PNM::Image do
|
12
14
|
|
@@ -47,229 +49,229 @@ describe PNM::Image do
|
|
47
49
|
end
|
48
50
|
|
49
51
|
it "freezes pixel data" do
|
50
|
-
|
52
|
+
_ { @bilevel.pixels << [1, 1, 0, 1, 1] }.must_raise RuntimeError
|
51
53
|
end
|
52
54
|
|
53
55
|
it "freezes comment string" do
|
54
|
-
|
56
|
+
_ { @bilevel.comment << "string" }.must_raise RuntimeError
|
55
57
|
end
|
56
58
|
|
57
59
|
it "sets maxgray to 1 for bilevel images" do
|
58
60
|
image = PNM.create([[0, 1, 0], [1, 0, 1]])
|
59
|
-
image.type.must_equal :pbm
|
60
|
-
image.maxgray.must_equal 1
|
61
|
+
_(image.type).must_equal :pbm
|
62
|
+
_(image.maxgray).must_equal 1
|
61
63
|
end
|
62
64
|
|
63
65
|
it "sets maxgray by default to 255 for grayscale images" do
|
64
66
|
image = PNM.create([[0, 10, 20], [10, 20, 30]])
|
65
|
-
image.type.must_equal :pgm
|
66
|
-
image.maxgray.must_equal 255
|
67
|
+
_(image.type).must_equal :pgm
|
68
|
+
_(image.maxgray).must_equal 255
|
67
69
|
end
|
68
70
|
|
69
71
|
it "sets maxgray by default to 255 for color images" do
|
70
72
|
image = PNM.create([[[0, 0, 0], [10, 10, 10]], [[10, 10, 10], [20, 20, 20]]])
|
71
|
-
image.type.must_equal :ppm
|
72
|
-
image.maxgray.must_equal 255
|
73
|
+
_(image.type).must_equal :ppm
|
74
|
+
_(image.maxgray).must_equal 255
|
73
75
|
end
|
74
76
|
|
75
77
|
it "accepts setting of maxgray to 1 for bilevel images" do
|
76
78
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], maxgray: 1)
|
77
|
-
image.type.must_equal :pbm
|
78
|
-
image.maxgray.must_equal 1
|
79
|
+
_(image.type).must_equal :pbm
|
80
|
+
_(image.maxgray).must_equal 1
|
79
81
|
end
|
80
82
|
|
81
83
|
it "ignores invalid maxgray for bilevel images and sets it to 1" do
|
82
84
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], type: :pbm, maxgray: 255)
|
83
|
-
image.type.must_equal :pbm
|
84
|
-
image.maxgray.must_equal 1
|
85
|
+
_(image.type).must_equal :pbm
|
86
|
+
_(image.maxgray).must_equal 1
|
85
87
|
end
|
86
88
|
|
87
89
|
it "can create a grayscale image from bilevel values (using type)" do
|
88
90
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], type: :pgm)
|
89
|
-
image.type.must_equal :pgm
|
90
|
-
image.pixels.must_equal [[0, 1, 0], [1, 0, 1]]
|
91
|
-
image.maxgray.must_equal 255
|
91
|
+
_(image.type).must_equal :pgm
|
92
|
+
_(image.pixels).must_equal [[0, 1, 0], [1, 0, 1]]
|
93
|
+
_(image.maxgray).must_equal 255
|
92
94
|
end
|
93
95
|
|
94
96
|
it "also accepts types given as string instead of symbol" do
|
95
97
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], type: "pgm")
|
96
|
-
image.type.must_equal :pgm
|
98
|
+
_(image.type).must_equal :pgm
|
97
99
|
end
|
98
100
|
|
99
101
|
it "can create a grayscale image from bilevel values (using maxgray)" do
|
100
102
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], maxgray: 2)
|
101
|
-
image.type.must_equal :pgm
|
102
|
-
image.pixels.must_equal [[0, 1, 0], [1, 0, 1]]
|
103
|
-
image.maxgray.must_equal 2
|
103
|
+
_(image.type).must_equal :pgm
|
104
|
+
_(image.pixels).must_equal [[0, 1, 0], [1, 0, 1]]
|
105
|
+
_(image.maxgray).must_equal 2
|
104
106
|
end
|
105
107
|
|
106
108
|
it "can create a color image from bilevel values" do
|
107
109
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], type: :ppm)
|
108
|
-
image.info.
|
109
|
-
image.pixels.must_equal [[[0, 0, 0], [1, 1, 1], [0, 0, 0]], [[1, 1, 1], [0, 0, 0], [1, 1, 1]]]
|
110
|
-
image.maxgray.must_equal 255
|
110
|
+
_(image.info).must_equal "PPM 3x2 Color"
|
111
|
+
_(image.pixels).must_equal [[[0, 0, 0], [1, 1, 1], [0, 0, 0]], [[1, 1, 1], [0, 0, 0], [1, 1, 1]]]
|
112
|
+
_(image.maxgray).must_equal 255
|
111
113
|
end
|
112
114
|
|
113
115
|
it "can create a color image from bilevel values with a given maxgray" do
|
114
116
|
image = PNM.create([[0, 1, 0], [1, 0, 1]], type: :ppm, maxgray: 2)
|
115
|
-
image.info.
|
116
|
-
image.pixels.must_equal [[[0, 0, 0], [1, 1, 1], [0, 0, 0]], [[1, 1, 1], [0, 0, 0], [1, 1, 1]]]
|
117
|
-
image.maxgray.must_equal 2
|
117
|
+
_(image.info).must_equal "PPM 3x2 Color"
|
118
|
+
_(image.pixels).must_equal [[[0, 0, 0], [1, 1, 1], [0, 0, 0]], [[1, 1, 1], [0, 0, 0], [1, 1, 1]]]
|
119
|
+
_(image.maxgray).must_equal 2
|
118
120
|
end
|
119
121
|
|
120
122
|
it "can create a color image from gray values" do
|
121
123
|
image = PNM.create([[0, 3, 6], [3, 6, 9]], type: :ppm)
|
122
|
-
image.info.
|
123
|
-
image.pixels.must_equal [[[0, 0, 0], [3, 3, 3], [6, 6, 6]], [[3, 3, 3], [6, 6, 6], [9, 9, 9]]]
|
124
|
+
_(image.info).must_equal "PPM 3x2 Color"
|
125
|
+
_(image.pixels).must_equal [[[0, 0, 0], [3, 3, 3], [6, 6, 6]], [[3, 3, 3], [6, 6, 6], [9, 9, 9]]]
|
124
126
|
end
|
125
127
|
|
126
128
|
it "does not modify the input data for color images created from gray values" do
|
127
129
|
data = [[0, 3, 6], [3, 6, 9]]
|
128
130
|
PNM.create(data, type: :ppm)
|
129
|
-
data.must_equal [[0, 3, 6], [3, 6, 9]]
|
131
|
+
_(data).must_equal [[0, 3, 6], [3, 6, 9]]
|
130
132
|
end
|
131
133
|
|
132
134
|
it "can write a bilevel image to an ASCII encoded file" do
|
133
135
|
@bilevel.write(@temp_path, :ascii)
|
134
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_ascii.pbm")
|
136
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/bilevel_ascii.pbm")
|
135
137
|
File.delete(@temp_path)
|
136
138
|
end
|
137
139
|
|
138
140
|
it "can write a bilevel image (width 5) to a binary encoded file" do
|
139
141
|
@bilevel.write(@temp_path, :binary)
|
140
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_binary.pbm")
|
142
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/bilevel_binary.pbm")
|
141
143
|
File.delete(@temp_path)
|
142
144
|
end
|
143
145
|
|
144
146
|
it "can write a bilevel image (width 16) to a binary encoded file" do
|
145
147
|
@bilevel2.write(@temp_path, :binary)
|
146
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_2_binary.pbm")
|
148
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/bilevel_2_binary.pbm")
|
147
149
|
File.delete(@temp_path)
|
148
150
|
end
|
149
151
|
|
150
152
|
it "can write a grayscale image to an ASCII encoded file" do
|
151
153
|
@grayscale.write(@temp_path, :ascii)
|
152
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_ascii.pgm")
|
154
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/grayscale_ascii.pgm")
|
153
155
|
File.delete(@temp_path)
|
154
156
|
end
|
155
157
|
|
156
158
|
it "can write a grayscale image to a binary encoded file" do
|
157
159
|
@grayscale.write(@temp_path, :binary)
|
158
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary.pgm")
|
160
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/grayscale_binary.pgm")
|
159
161
|
File.delete(@temp_path)
|
160
162
|
end
|
161
163
|
|
162
164
|
it "can write a color image to an ASCII encoded file" do
|
163
165
|
@color.write(@temp_path, :ascii)
|
164
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/color_ascii.ppm")
|
166
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/color_ascii.ppm")
|
165
167
|
File.delete(@temp_path)
|
166
168
|
end
|
167
169
|
|
168
170
|
it "can write a color image to a binary encoded file" do
|
169
171
|
@color.write(@temp_path, :binary)
|
170
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/color_binary.ppm")
|
172
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/color_binary.ppm")
|
171
173
|
File.delete(@temp_path)
|
172
174
|
end
|
173
175
|
|
174
176
|
it "can write a bilevel image to a file, adding the extension" do
|
175
177
|
@bilevel.write_with_extension(@temp_path)
|
176
|
-
File.binread("#{@temp_path}.pbm").must_equal File.binread("#{@srcpath}/bilevel_binary.pbm")
|
178
|
+
_(File.binread("#{@temp_path}.pbm")).must_equal File.binread("#{@srcpath}/bilevel_binary.pbm")
|
177
179
|
File.delete("#{@temp_path}.pbm")
|
178
180
|
end
|
179
181
|
|
180
182
|
it "can write a grayscale image to a file, adding the extension" do
|
181
183
|
@grayscale.write_with_extension(@temp_path, :ascii)
|
182
|
-
File.binread("#{@temp_path}.pgm").must_equal File.binread("#{@srcpath}/grayscale_ascii.pgm")
|
184
|
+
_(File.binread("#{@temp_path}.pgm")).must_equal File.binread("#{@srcpath}/grayscale_ascii.pgm")
|
183
185
|
File.delete("#{@temp_path}.pgm")
|
184
186
|
end
|
185
187
|
|
186
188
|
it "can write a color image to a file, adding the extension" do
|
187
189
|
@color.write_with_extension(@temp_path, :binary)
|
188
|
-
File.binread("#{@temp_path}.ppm").must_equal File.binread("#{@srcpath}/color_binary.ppm")
|
190
|
+
_(File.binread("#{@temp_path}.ppm")).must_equal File.binread("#{@srcpath}/color_binary.ppm")
|
189
191
|
File.delete("#{@temp_path}.ppm")
|
190
192
|
end
|
191
193
|
|
192
194
|
it "can return image information" do
|
193
|
-
@bilevel.info.must_equal "PBM 5x6 Bilevel"
|
194
|
-
@grayscale.info.must_equal "PGM 4x3 Grayscale"
|
195
|
-
@color.info.must_equal "PPM 5x3 Color"
|
195
|
+
_(@bilevel.info).must_equal "PBM 5x6 Bilevel"
|
196
|
+
_(@grayscale.info).must_equal "PGM 4x3 Grayscale"
|
197
|
+
_(@color.info).must_equal "PPM 5x3 Color"
|
196
198
|
end
|
197
199
|
|
198
200
|
it "can return meaningful debugging information" do
|
199
|
-
@bilevel.inspect.must_match %r{
|
200
|
-
@grayscale.inspect.must_match %r{
|
201
|
-
@color.inspect.must_match %r{
|
201
|
+
_(@bilevel.inspect).must_match %r{\A#<PNM::PBMImage:0x\h+ PBM 5x6 Bilevel>\z}
|
202
|
+
_(@grayscale.inspect).must_match %r{\A#<PNM::PGMImage:0x\h+ PGM 4x3 Grayscale, maxgray=250>\z}
|
203
|
+
_(@color.inspect).must_match %r{\A#<PNM::PPMImage:0x\h+ PPM 5x3 Color, maxgray=6>\z}
|
202
204
|
end
|
203
205
|
|
204
206
|
it "can write binary data containing CRLF" do
|
205
207
|
@grayscale_crlf.write(@temp_path, :binary)
|
206
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
|
208
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
|
207
209
|
File.delete(@temp_path)
|
208
210
|
end
|
209
211
|
|
210
212
|
it "can write binary data containing CRLF to an I/O stream" do
|
211
213
|
File.open(@temp_path, "w") {|f| @grayscale_crlf.write(f, :binary) }
|
212
|
-
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
|
214
|
+
_(File.binread(@temp_path)).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
|
213
215
|
File.delete(@temp_path)
|
214
216
|
end
|
215
217
|
|
216
218
|
it "can write zero-length comments" do
|
217
219
|
comment = ""
|
218
220
|
PNM.create([[0, 0]], comment: comment).write(@temp_path, :ascii)
|
219
|
-
File.binread(@temp_path).must_equal "P1\n#\n2 1\n0 0\n"
|
221
|
+
_(File.binread(@temp_path)).must_equal "P1\n#\n2 1\n0 0\n"
|
220
222
|
File.delete(@temp_path)
|
221
223
|
end
|
222
224
|
|
223
225
|
it "can write comments with trailing zero-length line" do
|
224
226
|
comment = "An empty line:\n"
|
225
227
|
PNM.create([[0, 0]], comment: comment).write(@temp_path, :ascii)
|
226
|
-
File.binread(@temp_path).must_equal "P1\n# An empty line:\n#\n2 1\n0 0\n"
|
228
|
+
_(File.binread(@temp_path)).must_equal "P1\n# An empty line:\n#\n2 1\n0 0\n"
|
227
229
|
File.delete(@temp_path)
|
228
230
|
end
|
229
231
|
|
230
232
|
it "can check equality of images (1)" do
|
231
233
|
pixels = [[0, 1, 0], [1, 0, 1]]
|
232
|
-
|
234
|
+
bilevel1 = PNM.create(pixels, comment: "image")
|
233
235
|
bilevel2 = PNM.create(pixels, comment: "image")
|
234
236
|
|
235
|
-
(bilevel2 ==
|
237
|
+
_(bilevel2 == bilevel1).must_equal true
|
236
238
|
end
|
237
239
|
|
238
240
|
it "can check equality of images (2)" do
|
239
241
|
pixels = [[0, 1, 0], [1, 0, 1]]
|
240
|
-
|
242
|
+
bilevel1 = PNM.create(pixels, comment: "image")
|
241
243
|
bilevel2 = PNM.create(pixels, comment: "other image")
|
242
244
|
|
243
|
-
(bilevel2 ==
|
245
|
+
_(bilevel2 == bilevel1).must_equal false
|
244
246
|
end
|
245
247
|
|
246
248
|
it "can check equality of images (3)" do
|
247
249
|
pixels = [[0, 1, 0], [1, 0, 1]]
|
248
|
-
|
250
|
+
bilevel1 = PNM.create(pixels)
|
249
251
|
bilevel2 = PNM.create(pixels.reverse)
|
250
252
|
|
251
|
-
(bilevel2 ==
|
253
|
+
_(bilevel2 == bilevel1).must_equal false
|
252
254
|
end
|
253
255
|
|
254
256
|
it "can check equality of images (4)" do
|
255
257
|
pixels = [[0, 1, 0], [1, 0, 1]]
|
256
|
-
bilevel
|
258
|
+
bilevel = PNM.create(pixels, type: :pbm)
|
257
259
|
graylevel = PNM.create(pixels, type: :pgm)
|
258
260
|
|
259
|
-
(graylevel == bilevel).must_equal false
|
261
|
+
_(graylevel == bilevel).must_equal false
|
260
262
|
end
|
261
263
|
|
262
264
|
it "can check equality of images (5)" do
|
263
265
|
pixels = [[0, 1, 2], [3, 4, 5]]
|
264
|
-
|
266
|
+
graylevel1 = PNM.create(pixels, maxgray: 10)
|
265
267
|
graylevel2 = PNM.create(pixels, maxgray: 255)
|
266
268
|
|
267
|
-
(graylevel2 ==
|
269
|
+
_(graylevel2 == graylevel1).must_equal false
|
268
270
|
end
|
269
271
|
|
270
272
|
it "can check equality of images (6)" do
|
271
273
|
image = PNM.create([[0, 1, 2], [3, 4, 5]])
|
272
274
|
|
273
|
-
(image == "a string").must_equal false
|
275
|
+
_(image == "a string").must_equal false
|
274
276
|
end
|
275
277
|
end
|
data/test/test_parser.rb
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
# test_parser.rb: Unit tests for the PNM library.
|
4
4
|
#
|
5
|
-
# Copyright (C) 2013-
|
5
|
+
# Copyright (C) 2013-2020 Marcus Stollsteimer
|
6
6
|
|
7
7
|
require "minitest/autorun"
|
8
8
|
require "pnm/parser"
|
9
9
|
|
10
|
+
require_relative "backports"
|
11
|
+
|
10
12
|
|
11
13
|
describe PNM::Parser do
|
12
14
|
|
@@ -27,7 +29,7 @@ describe PNM::Parser do
|
|
27
29
|
data: "0 1 0 0 1 1\n0 0 0 1 1 1"
|
28
30
|
}
|
29
31
|
|
30
|
-
@parser.parse(content).must_equal expected
|
32
|
+
_(@parser.parse(content)).must_equal expected
|
31
33
|
end
|
32
34
|
|
33
35
|
it "can parse ASCII encoded PGM data" do
|
@@ -44,7 +46,7 @@ describe PNM::Parser do
|
|
44
46
|
data: "10 20 30 40\n50 60 70 80"
|
45
47
|
}
|
46
48
|
|
47
|
-
@parser.parse(content).must_equal expected
|
49
|
+
_(@parser.parse(content)).must_equal expected
|
48
50
|
end
|
49
51
|
|
50
52
|
it "can parse binary encoded data" do
|
@@ -56,7 +58,7 @@ describe PNM::Parser do
|
|
56
58
|
data: ["05AF"].pack("H*")
|
57
59
|
}
|
58
60
|
|
59
|
-
@parser.parse(content).must_equal expected
|
61
|
+
_(@parser.parse(content)).must_equal expected
|
60
62
|
end
|
61
63
|
|
62
64
|
it "does not change the passed data" do
|
@@ -64,7 +66,7 @@ describe PNM::Parser do
|
|
64
66
|
original_content = content.dup
|
65
67
|
@parser.parse(content)
|
66
68
|
|
67
|
-
content.must_equal original_content
|
69
|
+
_(content).must_equal original_content
|
68
70
|
end
|
69
71
|
|
70
72
|
it "does accept multiple whitespace as delimiter" do
|
@@ -76,23 +78,23 @@ describe PNM::Parser do
|
|
76
78
|
data: "0 1 0 0 1 1"
|
77
79
|
}
|
78
80
|
|
79
|
-
@parser.parse(content).must_equal expected
|
81
|
+
_(@parser.parse(content)).must_equal expected
|
80
82
|
end
|
81
83
|
|
82
84
|
it "can parse binary encoded data including whitespace" do
|
83
|
-
@parser.parse("P4 16 4 A\nB\rC D\t")[:data].must_equal "A\nB\rC D\t"
|
85
|
+
_(@parser.parse("P4 16 4 A\nB\rC D\t")[:data]).must_equal "A\nB\rC D\t"
|
84
86
|
end
|
85
87
|
|
86
88
|
it "can parse binary encoded data starting with whitespace" do
|
87
|
-
@parser.parse("P4 8 2 \nA")[:data].must_equal "\nA"
|
89
|
+
_(@parser.parse("P4 8 2 \nA")[:data]).must_equal "\nA"
|
88
90
|
end
|
89
91
|
|
90
92
|
it "can parse binary encoded data starting with comment character" do
|
91
|
-
@parser.parse("P4 8 2 #A")[:data].must_equal "#A"
|
93
|
+
_(@parser.parse("P4 8 2 #A")[:data]).must_equal "#A"
|
92
94
|
end
|
93
95
|
|
94
96
|
it "does not chomp newlines from parsed binary encoded data" do
|
95
|
-
@parser.parse("P4 8 2 AB\n")[:data].must_equal "AB\n"
|
97
|
+
_(@parser.parse("P4 8 2 AB\n")[:data]).must_equal "AB\n"
|
96
98
|
end
|
97
99
|
|
98
100
|
it "can parse comments" do
|
@@ -115,6 +117,6 @@ describe PNM::Parser do
|
|
115
117
|
data: "0 1 0 0 1 1\n0 0 0 1 1 1"
|
116
118
|
}
|
117
119
|
|
118
|
-
@parser.parse(content).must_equal expected
|
120
|
+
_(@parser.parse(content)).must_equal expected
|
119
121
|
end
|
120
122
|
end
|
data/test/test_pnm.rb
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
# test_pnm.rb: Unit tests for the PNM library.
|
4
4
|
#
|
5
|
-
# Copyright (C) 2013-
|
5
|
+
# Copyright (C) 2013-2020 Marcus Stollsteimer
|
6
6
|
|
7
7
|
require "minitest/autorun"
|
8
8
|
require "pnm"
|
9
9
|
|
10
|
+
require_relative "backports"
|
11
|
+
|
10
12
|
|
11
13
|
describe PNM do
|
12
14
|
|
@@ -18,89 +20,89 @@ describe PNM do
|
|
18
20
|
file = File.expand_path("#{@srcpath}/bilevel_ascii.pbm")
|
19
21
|
image = PNM.read(file)
|
20
22
|
|
21
|
-
image.info.
|
22
|
-
image.maxgray.must_equal 1
|
23
|
-
image.comment.must_equal "Bilevel"
|
24
|
-
image.pixels.must_equal [[0, 0, 0, 0, 0],
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
_(image.info).must_equal "PBM 5x6 Bilevel"
|
24
|
+
_(image.maxgray).must_equal 1
|
25
|
+
_(image.comment).must_equal "Bilevel"
|
26
|
+
_(image.pixels).must_equal [[0, 0, 0, 0, 0],
|
27
|
+
[0, 1, 1, 1, 0],
|
28
|
+
[0, 0, 1, 0, 0],
|
29
|
+
[0, 0, 1, 0, 0],
|
30
|
+
[0, 0, 1, 0, 0],
|
31
|
+
[0, 0, 0, 0, 0]]
|
30
32
|
end
|
31
33
|
|
32
34
|
it "can read an ASCII encoded PGM file" do
|
33
35
|
file = File.expand_path("#{@srcpath}/grayscale_ascii.pgm")
|
34
36
|
image = PNM.read(file)
|
35
37
|
|
36
|
-
image.info.
|
37
|
-
image.maxgray.must_equal 250
|
38
|
-
image.comment.must_equal "Grayscale\n(with multiline comment)"
|
39
|
-
image.pixels.must_equal [[ 0, 50, 100, 150],
|
40
|
-
|
41
|
-
|
38
|
+
_(image.info).must_equal "PGM 4x3 Grayscale"
|
39
|
+
_(image.maxgray).must_equal 250
|
40
|
+
_(image.comment).must_equal "Grayscale\n(with multiline comment)"
|
41
|
+
_(image.pixels).must_equal [[ 0, 50, 100, 150],
|
42
|
+
[ 50, 100, 150, 200],
|
43
|
+
[100, 150, 200, 250]]
|
42
44
|
end
|
43
45
|
|
44
46
|
it "can read an ASCII encoded PPM file" do
|
45
47
|
file = File.expand_path("#{@srcpath}/color_ascii.ppm")
|
46
48
|
image = PNM.read(file)
|
47
49
|
|
48
|
-
image.info.
|
49
|
-
image.maxgray.must_equal 6
|
50
|
-
image.pixels.must_equal [[[0, 6, 0], [1, 5, 1], [2, 4, 2], [3, 3, 4], [4, 2, 6]],
|
51
|
-
|
52
|
-
|
50
|
+
_(image.info).must_equal "PPM 5x3 Color"
|
51
|
+
_(image.maxgray).must_equal 6
|
52
|
+
_(image.pixels).must_equal [[[0, 6, 0], [1, 5, 1], [2, 4, 2], [3, 3, 4], [4, 2, 6]],
|
53
|
+
[[1, 5, 2], [2, 4, 2], [3, 3, 2], [4, 2, 2], [5, 1, 2]],
|
54
|
+
[[2, 4, 6], [3, 3, 4], [4, 2, 2], [5, 1, 1], [6, 0, 0]]]
|
53
55
|
end
|
54
56
|
|
55
57
|
it "can read a binary encoded PBM file" do
|
56
58
|
file = File.expand_path("#{@srcpath}/bilevel_binary.pbm")
|
57
59
|
image = PNM.read(file)
|
58
60
|
|
59
|
-
image.info.
|
60
|
-
image.maxgray.must_equal 1
|
61
|
-
image.comment.must_equal "Bilevel"
|
62
|
-
image.pixels.must_equal [[0, 0, 0, 0, 0],
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
61
|
+
_(image.info).must_equal "PBM 5x6 Bilevel"
|
62
|
+
_(image.maxgray).must_equal 1
|
63
|
+
_(image.comment).must_equal "Bilevel"
|
64
|
+
_(image.pixels).must_equal [[0, 0, 0, 0, 0],
|
65
|
+
[0, 1, 1, 1, 0],
|
66
|
+
[0, 0, 1, 0, 0],
|
67
|
+
[0, 0, 1, 0, 0],
|
68
|
+
[0, 0, 1, 0, 0],
|
69
|
+
[0, 0, 0, 0, 0]]
|
68
70
|
end
|
69
71
|
|
70
72
|
it "can read a binary encoded PGM file" do
|
71
73
|
file = File.expand_path("#{@srcpath}/grayscale_binary.pgm")
|
72
74
|
image = PNM.read(file)
|
73
75
|
|
74
|
-
image.info.
|
75
|
-
image.maxgray.must_equal 250
|
76
|
-
image.comment.must_equal "Grayscale\n(with multiline comment)"
|
77
|
-
image.pixels.must_equal [[ 0, 50, 100, 150],
|
78
|
-
|
79
|
-
|
76
|
+
_(image.info).must_equal "PGM 4x3 Grayscale"
|
77
|
+
_(image.maxgray).must_equal 250
|
78
|
+
_(image.comment).must_equal "Grayscale\n(with multiline comment)"
|
79
|
+
_(image.pixels).must_equal [[ 0, 50, 100, 150],
|
80
|
+
[ 50, 100, 150, 200],
|
81
|
+
[100, 150, 200, 250]]
|
80
82
|
end
|
81
83
|
|
82
84
|
it "can read a binary encoded PPM file" do
|
83
85
|
file = File.expand_path("#{@srcpath}/color_binary.ppm")
|
84
86
|
image = PNM.read(file)
|
85
87
|
|
86
|
-
image.info.
|
87
|
-
image.maxgray.must_equal 6
|
88
|
-
image.pixels.must_equal [[[0, 6, 0], [1, 5, 1], [2, 4, 2], [3, 3, 4], [4, 2, 6]],
|
89
|
-
|
90
|
-
|
88
|
+
_(image.info).must_equal "PPM 5x3 Color"
|
89
|
+
_(image.maxgray).must_equal 6
|
90
|
+
_(image.pixels).must_equal [[[0, 6, 0], [1, 5, 1], [2, 4, 2], [3, 3, 4], [4, 2, 6]],
|
91
|
+
[[1, 5, 2], [2, 4, 2], [3, 3, 2], [4, 2, 2], [5, 1, 2]],
|
92
|
+
[[2, 4, 6], [3, 3, 4], [4, 2, 2], [5, 1, 1], [6, 0, 0]]]
|
91
93
|
end
|
92
94
|
|
93
95
|
it "can read binary data containing CRLF" do
|
94
96
|
file = File.expand_path("#{@srcpath}/grayscale_binary_crlf.pgm")
|
95
97
|
|
96
98
|
image = PNM.read(file)
|
97
|
-
image.pixels.must_equal [[65, 66], [13, 10], [65, 66]]
|
99
|
+
_(image.pixels).must_equal [[65, 66], [13, 10], [65, 66]]
|
98
100
|
end
|
99
101
|
|
100
102
|
it "can read binary data containing CRLF from an I/O stream" do
|
101
103
|
file = File.expand_path("#{@srcpath}/grayscale_binary_crlf.pgm")
|
102
104
|
|
103
105
|
image = File.open(file, "r") {|f| PNM.read(f) }
|
104
|
-
image.pixels.must_equal [[65, 66], [13, 10], [65, 66]]
|
106
|
+
_(image.pixels).must_equal [[65, 66], [13, 10], [65, 66]]
|
105
107
|
end
|
106
108
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pnm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcus Stollsteimer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- lib/pnm/parser.rb
|
62
62
|
- lib/pnm/version.rb
|
63
63
|
- pnm.gemspec
|
64
|
+
- test/backports.rb
|
64
65
|
- test/bilevel_2_binary.pbm
|
65
66
|
- test/bilevel_ascii.pbm
|
66
67
|
- test/bilevel_binary.pbm
|
@@ -95,13 +96,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
96
|
- !ruby/object:Gem::Version
|
96
97
|
version: '0'
|
97
98
|
requirements: []
|
98
|
-
rubygems_version: 3.
|
99
|
+
rubygems_version: 3.1.2
|
99
100
|
signing_key:
|
100
101
|
specification_version: 4
|
101
102
|
summary: PNM - create/read/write PNM image files (PBM, PGM, PPM)
|
102
103
|
test_files:
|
103
104
|
- test/test_exceptions.rb
|
104
|
-
- test/test_image.rb
|
105
105
|
- test/test_converter.rb
|
106
106
|
- test/test_pnm.rb
|
107
|
+
- test/test_image.rb
|
107
108
|
- test/test_parser.rb
|