Skip to content

Commit 9d03f40

Browse files
Add support and tests for other GTIN formats
1 parent c678c60 commit 9d03f40

File tree

4 files changed

+100
-13
lines changed

4 files changed

+100
-13
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Add `barcode_generator` to your list of dependencies in `mix.exs`:
7575

7676
```elixir
7777
def deps do
78-
[{:barcode_generator, "~> 1.0.0"}]
78+
[{:barcode_generator, "~> 1.1.0"}]
7979
end
8080
```
8181

lib/barcode_generator.ex

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ defmodule BarcodeGenerator do
2525
iex> BarcodeGenerator.valid?(6291041500206)
2626
true
2727
28+
iex> BarcodeGenerator.valid?(619659161415)
29+
true
30+
2831
iex> BarcodeGenerator.valid?("6291041500200")
2932
false
3033
@@ -171,8 +174,8 @@ defmodule BarcodeGenerator do
171174

172175
@compile {:inline, multiplicator: 1}
173176
@spec multiplicator(integer()) :: 3 | 1
174-
defp multiplicator(index) when is_odd(index), do: 3
175-
defp multiplicator(_index), do: 1
177+
defp multiplicator(index) when is_odd(index), do: 1
178+
defp multiplicator(_index), do: 3
176179

177180
@spec fetch_stack(non_neg_integer(), stack_with_base() | nil) :: stack_with_base()
178181
defp fetch_stack(base, nil), do: {init_stack(base), div(base, 10)}
@@ -184,23 +187,25 @@ defmodule BarcodeGenerator do
184187
end
185188
end
186189

187-
@spec init_stack(non_neg_integer() | [digit()]) :: stack()
188-
defp init_stack(base_or_digits, offset \\ 0, sum \\ 0)
190+
@spec init_stack(non_neg_integer() | [digit()], integer()) :: stack()
191+
defp init_stack(base_or_digits, sum \\ 0)
189192

190-
defp init_stack(base, offset, sum) when is_integer(base),
191-
do: base |> Integer.digits() |> init_stack(offset, sum)
193+
defp init_stack(base, sum) when is_integer(base),
194+
do: base |> Integer.digits() |> init_stack(sum)
195+
196+
defp init_stack(digits, sum) do
197+
length = length(digits) - 1
192198

193-
defp init_stack(digits, offset, sum) do
194199
digits
195-
|> Enum.with_index(offset)
200+
|> Enum.with_index(fn element, index -> {element, length - index} end)
196201
|> Enum.map_reduce(sum, fn
197202
{digit, index}, acc when is_odd(index) ->
198-
acc = acc + digit * 3
203+
acc = acc + digit
199204

200205
{{digit, index, acc}, acc}
201206

202207
{digit, index}, acc ->
203-
acc = acc + digit
208+
acc = acc + digit * 3
204209

205210
{{digit, index, acc}, acc}
206211
end)
@@ -224,7 +229,7 @@ defmodule BarcodeGenerator do
224229
end
225230

226231
defp do_update_stack(digits, [{prev_digit, index, sum} | _stack], acc) do
227-
init_stack(digits, index, sum - multiplicator(index) * prev_digit) ++ acc
232+
init_stack(digits, sum - multiplicator(index) * prev_digit) ++ acc
228233
end
229234

230235
@compile {:inline, base: 1}

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule BarcodeGenerator.MixProject do
22
use Mix.Project
33

4-
@version "1.0.0"
4+
@version "1.1.0"
55
@repo_url "https://github.com/jeroenvisser101/barcode_generator"
66

77
def project do

test/barcode_generator_test.exs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,51 +66,133 @@ defmodule BarcodeGeneratorTest do
6666

6767
describe "BarcodeGenerator.generate/2" do
6868
test "generates valid barcodes" do
69+
# GTIN-12
70+
barcodes = BarcodeGenerator.generate(619_659_161_415, 619_659_161_509)
71+
72+
assert length(barcodes) == 10
73+
assert Enum.all?(barcodes, &BarcodeGenerator.valid?/1)
74+
75+
# GTIN-13
6976
barcodes = BarcodeGenerator.generate(6_291_041_500_200, 6_291_041_500_299)
7077

7178
assert length(barcodes) == 10
7279
assert Enum.all?(barcodes, &BarcodeGenerator.valid?/1)
80+
81+
# GTIN-14
82+
barcodes = BarcodeGenerator.generate(62_910_415_000_200, 62_910_415_000_299)
83+
84+
assert length(barcodes) == 10
85+
assert Enum.all?(barcodes, &BarcodeGenerator.valid?/1)
7386
end
7487

7588
test "handles stack-exceeding barcodes" do
89+
# GTIN-12
90+
barcodes = BarcodeGenerator.generate(619_659_161_415, 619_659_162_509)
91+
92+
assert length(barcodes) == 110
93+
assert Enum.all?(barcodes, &BarcodeGenerator.valid?/1)
94+
95+
# GTIN-13
7696
barcodes = BarcodeGenerator.generate(6_291_041_500_200, 6_291_041_501_299)
7797

7898
assert length(barcodes) == 110
7999
assert Enum.all?(barcodes, &BarcodeGenerator.valid?/1)
100+
101+
# GTIN-14
102+
barcodes = BarcodeGenerator.generate(62_910_415_000_200, 62_910_415_001_299)
103+
104+
assert length(barcodes) == 110
105+
assert Enum.all?(barcodes, &BarcodeGenerator.valid?/1)
80106
end
81107
end
82108

83109
describe "BarcodeGenerator.generate_stream/2" do
84110
test "generates valid barcodes" do
111+
# GTIN-12
112+
barcode_stream = BarcodeGenerator.generate_stream(619_659_161_415, 619_659_161_509)
113+
114+
assert Enum.count(barcode_stream) == 10
115+
assert Enum.all?(barcode_stream, &BarcodeGenerator.valid?/1)
116+
117+
# GTIN-13
85118
barcode_stream = BarcodeGenerator.generate_stream(6_291_041_500_200, 6_291_041_500_299)
86119

87120
assert Enum.count(barcode_stream) == 10
88121
assert Enum.all?(barcode_stream, &BarcodeGenerator.valid?/1)
122+
123+
# GTIN-14
124+
barcode_stream = BarcodeGenerator.generate_stream(62_910_415_000_200, 62_910_415_000_299)
125+
126+
assert Enum.count(barcode_stream) == 10
127+
assert Enum.all?(barcode_stream, &BarcodeGenerator.valid?/1)
89128
end
90129

91130
test "handles stack-exceeding barcodes" do
131+
# GTIN-12
132+
barcode_stream = BarcodeGenerator.generate_stream(619_659_161_415, 619_659_162_509)
133+
134+
assert Enum.count(barcode_stream) == 110
135+
assert Enum.all?(barcode_stream, &BarcodeGenerator.valid?/1)
136+
137+
# GTIN-13
92138
barcode_stream = BarcodeGenerator.generate_stream(6_291_041_500_200, 6_291_041_501_299)
93139

94140
assert Enum.count(barcode_stream) == 110
95141
assert Enum.all?(barcode_stream, &BarcodeGenerator.valid?/1)
142+
143+
# GTIN-14
144+
barcode_stream = BarcodeGenerator.generate_stream(62_910_415_000_200, 62_910_415_001_299)
145+
146+
assert Enum.count(barcode_stream) == 110
147+
assert Enum.all?(barcode_stream, &BarcodeGenerator.valid?/1)
96148
end
97149
end
98150

99151
describe "BarcodeGenerator.generate_flow/2" do
100152
test "generates valid barcodes" do
153+
# GTIN-12
154+
barcode_flow = BarcodeGenerator.generate_flow(619_659_161_415, 619_659_161_509)
155+
156+
assert %Flow{} = barcode_flow
157+
assert Enum.count(barcode_flow) == 10
158+
assert Enum.all?(barcode_flow, &BarcodeGenerator.valid?/1)
159+
160+
# GTIN-13
101161
barcode_flow = BarcodeGenerator.generate_flow(6_291_041_500_200, 6_291_041_500_299)
102162

103163
assert %Flow{} = barcode_flow
104164
assert Enum.count(barcode_flow) == 10
105165
assert Enum.all?(barcode_flow, &BarcodeGenerator.valid?/1)
166+
167+
# GTIN-14
168+
barcode_flow = BarcodeGenerator.generate_flow(62_910_415_000_200, 62_910_415_000_299)
169+
170+
assert %Flow{} = barcode_flow
171+
assert Enum.count(barcode_flow) == 10
172+
assert Enum.all?(barcode_flow, &BarcodeGenerator.valid?/1)
106173
end
107174

108175
test "handles stack-exceeding barcodes" do
176+
# GTIN-12
177+
barcode_flow = BarcodeGenerator.generate_flow(619_659_161_415, 619_659_162_509)
178+
179+
assert %Flow{} = barcode_flow
180+
assert Enum.count(barcode_flow) == 110
181+
assert Enum.all?(barcode_flow, &BarcodeGenerator.valid?/1)
182+
183+
# GTIN-13
109184
barcode_flow = BarcodeGenerator.generate_flow(6_291_041_500_200, 6_291_041_501_299)
110185

111186
assert %Flow{} = barcode_flow
112187
assert Enum.count(barcode_flow) == 110
113188
assert Enum.all?(barcode_flow, &BarcodeGenerator.valid?/1)
189+
190+
# GTIN-14
191+
barcode_flow = BarcodeGenerator.generate_flow(62_910_415_000_200, 62_910_415_001_299)
192+
193+
assert %Flow{} = barcode_flow
194+
assert Enum.count(barcode_flow) == 110
195+
assert Enum.all?(barcode_flow, &BarcodeGenerator.valid?/1)
114196
end
115197
end
116198
end

0 commit comments

Comments
 (0)