pax_global_header 0000666 0000000 0000000 00000000064 14111655462 0014517 g ustar 00root root 0000000 0000000 52 comment=f6b9c9bdedee912742e777e5db1da437f2cd25d8
whomwah-rqrcode_core-f6b9c9b/ 0000775 0000000 0000000 00000000000 14111655462 0016344 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/.github/ 0000775 0000000 0000000 00000000000 14111655462 0017704 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/.github/workflows/ 0000775 0000000 0000000 00000000000 14111655462 0021741 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/.github/workflows/ruby.yml 0000664 0000000 0000000 00000001207 14111655462 0023445 0 ustar 00root root 0000000 0000000 name: rqrcode_core
on:
push:
branches:
- master
- release/*
pull_request:
branches:
- master
jobs:
Build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
ruby: [2.5, 2.6, 2.7, 3.0]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v1
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run Tests
run: bundle exec rake test
- name: StandardRB Check
run: bundle exec standardrb --format progress
whomwah-rqrcode_core-f6b9c9b/.gitignore 0000664 0000000 0000000 00000000137 14111655462 0020335 0 ustar 00root root 0000000 0000000 /.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
/.devcontainer/
*.gem
whomwah-rqrcode_core-f6b9c9b/CHANGELOG.md 0000664 0000000 0000000 00000002727 14111655462 0020165 0 ustar 00root root 0000000 0000000 # Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.2.0] - 2021-08-26
- Added Multi Mode Support which allows for multi-segment encoding. Thanks to [@ssayer](https://github.com/ssayer)
## [1.1.0] - 2021-07-01
- Add a basic benchmark file
- Add standardRB badge
- Add `.freeze` on `CONST` lookup objects
- Remove unused `@mode` instance variable
- A batch of small refactors and optimizations
## [1.0.0] - 2021-04-23
### Changed
- README updated
- Small documentation clarification [@smnscp](https://github.com/smnscp).
- Rakefile cleaned up. You can now just run `rake` which will run specs and fix linting using `standardrb`
### Breaking Changes
- Very niche but a breaking change never the less. The `to_s` method *no longer* accepts the `:true` and `:false` arguments, but prefers `:dark` and `:light`.
## [0.2.0] - 2020-12-26
### Changed
- fix `required_ruby_version` for Ruby 3 support
[unreleased]: https://github.com/whomwah/rqrcode_core/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/whomwah/rqrcode_core/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/whomwah/rqrcode_core/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/whomwah/rqrcode_core/compare/v0.2.0...v1.0.0
[0.2.0]: https://github.com/whomwah/rqrcode_core/compare/v0.1.2...v0.2.0
whomwah-rqrcode_core-f6b9c9b/Gemfile 0000664 0000000 0000000 00000000141 14111655462 0017633 0 ustar 00root root 0000000 0000000 source "https://rubygems.org"
# Specify your gem's dependencies in rqrcode-base.gemspec
gemspec
whomwah-rqrcode_core-f6b9c9b/Gemfile.lock 0000664 0000000 0000000 00000002002 14111655462 0020560 0 ustar 00root root 0000000 0000000 PATH
remote: .
specs:
rqrcode_core (1.2.0)
GEM
remote: https://rubygems.org/
specs:
ast (2.4.2)
minitest (5.14.4)
parallel (1.20.1)
parser (3.0.2.0)
ast (~> 2.4.1)
rainbow (3.0.0)
rake (13.0.6)
regexp_parser (2.1.1)
rexml (3.2.5)
rubocop (1.18.4)
parallel (~> 1.10)
parser (>= 3.0.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml
rubocop-ast (>= 1.8.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.9.1)
parser (>= 3.0.1.1)
rubocop-performance (1.11.4)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
ruby-progressbar (1.11.0)
standard (1.1.7)
rubocop (= 1.18.4)
rubocop-performance (= 1.11.4)
standardrb (1.0.0)
standard
unicode-display_width (2.0.0)
PLATFORMS
ruby
DEPENDENCIES
bundler (~> 2.0)
minitest (~> 5.0)
rake (~> 13.0)
rqrcode_core!
standardrb (~> 1.0)
BUNDLED WITH
2.2.22
whomwah-rqrcode_core-f6b9c9b/LICENSE.txt 0000664 0000000 0000000 00000002073 14111655462 0020171 0 ustar 00root root 0000000 0000000 The MIT License (MIT)
Copyright (c) 2008 Duncan Robertson
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
whomwah-rqrcode_core-f6b9c9b/README.md 0000664 0000000 0000000 00000006652 14111655462 0017634 0 ustar 00root root 0000000 0000000 
[](https://github.com/testdouble/standard)
# RQRCodeCore
`rqrcode_core` is a library for encoding QR Codes in pure Ruby. It has a simple interface with all the standard qrcode options. It was originally adapted in 2008 from a Javascript library by [Kazuhiko Arase](https://github.com/kazuhikoarase).
Features:
* `rqrcode_core` is a Ruby only library. It requires no native libraries. Just Ruby!
* It is an encoding library. You can't decode QR Codes with it.
* The interface is simple and assumes you just want to encode a string into a QR Code, but also allows for encoding multiple segments.
* QR Code is trademarked by Denso Wave inc.
`rqrcode_core` is the basis of the popular `rqrcode` gem [https://github.com/whomwah/rqrcode]. This gem allows you to generate different renderings of your QR Code, including `png`, `svg` and `ansi`.
## Installation
Add this line to your application's Gemfile:
```ruby
gem "rqrcode_core"
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install rqrcode_core
## Basic Usage
```ruby
$ require "rqrcode_core"
$ qr = RQRCodeCore::QRCode.new("https://kyan.com")
$ puts qr.to_s
```
Output:
```
xxxxxxx x x x x x xx xxxxxxx
x x xxx xxxxxx xxx x x
x xxx x xxxxx x xx x xxx x
... etc
```
## Multiple Encoding Support
```ruby
$ require "rqrcode_core"
$ qr = RQRCodeCore::QRCode.new([{data: "byteencoded", mode: :byte_8bit}, {data: "A1" * 100, mode: :alphanumeric}, {data: "1" * 500, mode: :number}])
```
This will create a QR Code with byte encoded, alphanumeric and number segments. Any combination of encodings/segments will work provided it fits within size limits.
## Doing your own rendering
```ruby
require "rqrcode_core"
qr = RQRCodeCore::QRCode.new("https://kyan.com")
qr.rows.each do |row|
row.each do |col|
print col ? "#" : " "
end
print "\n"
end
```
### Options
The library expects a string or array (for multiple encodings) to be parsed in, other args are optional.
```
data - the string or array you wish to encode
size - the size (integer) of the QR Code (defaults to smallest size needed to encode the string)
max_size - the max_size (Integer) of the QR Code (default RQRCodeCore::QRUtil.max_size)
level - the error correction level, can be:
* Level :l 7% of code can be restored
* Level :m 15% of code can be restored
* Level :q 25% of code can be restored
* Level :h 30% of code can be restored (default :h)
mode - the mode of the QR Code (defaults to alphanumeric or byte_8bit, depending on the input data, only used when data is a string):
* :number
* :alphanumeric
* :byte_8bit
* :kanji
```
#### Example
```ruby
RQRCodeCore::QRCode.new("http://kyan.com", size: 1, level: :m, mode: :alphanumeric)
```
## Development
### Tests
You can run the test suite using:
```
$ ./bin/setup
$ rake
```
or try the project from the console with:
```
$ ./bin/console
```
### Linting
The project uses [standardrb](https://github.com/testdouble/standard) and can be run with:
```
$ ./bin/setup
$ rake standard # check
$ rake standard:fix # fix
```
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/whomwah/rqrcode_core.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
whomwah-rqrcode_core-f6b9c9b/Rakefile 0000664 0000000 0000000 00000000575 14111655462 0020020 0 ustar 00root root 0000000 0000000 begin
require "rake/testtask"
require "standard/rake"
Rake::TestTask.new(:test) do |t|
t.libs << "test"
t.libs << "lib"
t.test_files = FileList["test/**/*_test.rb"]
end
task default: [:test, "standard:fix"]
desc "Run a simple benchmark (x1000)"
task :benchmark do
ruby "test/benchmark.rb"
end
rescue LoadError
# no standard/rspec available
end
whomwah-rqrcode_core-f6b9c9b/bin/ 0000775 0000000 0000000 00000000000 14111655462 0017114 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/bin/console 0000775 0000000 0000000 00000000533 14111655462 0020505 0 ustar 00root root 0000000 0000000 #!/usr/bin/env ruby
require "bundler/setup"
require "rqrcode_core"
# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.
# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start
require "irb"
IRB.start(__FILE__)
whomwah-rqrcode_core-f6b9c9b/bin/setup 0000775 0000000 0000000 00000000203 14111655462 0020175 0 ustar 00root root 0000000 0000000 #!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx
bundle install
# Do any other automated setup that you need to do here
whomwah-rqrcode_core-f6b9c9b/lib/ 0000775 0000000 0000000 00000000000 14111655462 0017112 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core.rb 0000664 0000000 0000000 00000000167 14111655462 0022112 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
require "rqrcode_core/qrcode"
require "rqrcode_core/version"
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/ 0000775 0000000 0000000 00000000000 14111655462 0021561 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode.rb 0000664 0000000 0000000 00000000745 14111655462 0023371 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require "rqrcode_core/qrcode/qr_8bit_byte"
require "rqrcode_core/qrcode/qr_alphanumeric"
require "rqrcode_core/qrcode/qr_bit_buffer"
require "rqrcode_core/qrcode/qr_code"
require "rqrcode_core/qrcode/qr_math"
require "rqrcode_core/qrcode/qr_multi"
require "rqrcode_core/qrcode/qr_numeric"
require "rqrcode_core/qrcode/qr_polynomial"
require "rqrcode_core/qrcode/qr_rs_block"
require "rqrcode_core/qrcode/qr_segment"
require "rqrcode_core/qrcode/qr_util"
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/ 0000775 0000000 0000000 00000000000 14111655462 0023036 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_8bit_byte.rb 0000664 0000000 0000000 00000000424 14111655462 0025756 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QR8bitByte
def initialize(data)
@data = data
end
def write(buffer)
buffer.byte_encoding_start(@data.bytesize)
@data.each_byte do |b|
buffer.put(b, 8)
end
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_alphanumeric.rb 0000664 0000000 0000000 00000002036 14111655462 0026536 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
ALPHANUMERIC = [
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "$",
"%", "*", "+", "-", ".", "/", ":"
].freeze
class QRAlphanumeric
def initialize(data)
unless QRAlphanumeric.valid_data?(data)
raise QRCodeArgumentError, "Not a alpha numeric uppercase string `#{data}`"
end
@data = data
end
def self.valid_data?(data)
(data.chars - ALPHANUMERIC).empty?
end
def write(buffer)
buffer.alphanumeric_encoding_start(@data.size)
@data.size.times do |i|
if i % 2 == 0
if i == (@data.size - 1)
value = ALPHANUMERIC.index(@data[i])
buffer.put(value, 6)
else
value = (ALPHANUMERIC.index(@data[i]) * 45) + ALPHANUMERIC.index(@data[i + 1])
buffer.put(value, 11)
end
end
end
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_bit_buffer.rb 0000664 0000000 0000000 00000003255 14111655462 0026201 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRBitBuffer
attr_reader :buffer
PAD0 = 0xEC
PAD1 = 0x11
def initialize(version)
@version = version
@buffer = []
@length = 0
end
def get(index)
buf_index = (index / 8).floor
((QRUtil.rszf(@buffer[buf_index], 7 - index % 8)) & 1) == 1
end
def put(num, length)
(0...length).each do |i|
put_bit(((QRUtil.rszf(num, length - i - 1)) & 1) == 1)
end
end
def get_length_in_bits
@length
end
def put_bit(bit)
buf_index = (@length / 8).floor
if @buffer.size <= buf_index
@buffer << 0
end
if bit
@buffer[buf_index] |= QRUtil.rszf(0x80, @length % 8)
end
@length += 1
end
def byte_encoding_start(length)
put(QRMODE[:mode_8bit_byte], 4)
put(length, QRUtil.get_length_in_bits(QRMODE[:mode_8bit_byte], @version))
end
def alphanumeric_encoding_start(length)
put(QRMODE[:mode_alpha_numk], 4)
put(length, QRUtil.get_length_in_bits(QRMODE[:mode_alpha_numk], @version))
end
def numeric_encoding_start(length)
put(QRMODE[:mode_number], 4)
put(length, QRUtil.get_length_in_bits(QRMODE[:mode_number], @version))
end
def pad_until(prefered_size)
# Align on byte
while get_length_in_bits % 8 != 0
put_bit(false)
end
# Pad with padding code words
while get_length_in_bits < prefered_size
put(PAD0, 8)
put(PAD1, 8) if get_length_in_bits < prefered_size
end
end
def end_of_message(max_data_bits)
put(0, 4) unless get_length_in_bits + 4 > max_data_bits
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_code.rb 0000664 0000000 0000000 00000037302 14111655462 0025004 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
QRMODE = {
mode_number: 1 << 0,
mode_alpha_numk: 1 << 1,
mode_8bit_byte: 1 << 2
}.freeze
QRMODE_NAME = {
number: :mode_number,
alphanumeric: :mode_alpha_numk,
byte_8bit: :mode_8bit_byte,
multi: :mode_multi
}.freeze
QRERRORCORRECTLEVEL = {
l: 1,
m: 0,
q: 3,
h: 2
}.freeze
QRMASKPATTERN = {
pattern000: 0,
pattern001: 1,
pattern010: 2,
pattern011: 3,
pattern100: 4,
pattern101: 5,
pattern110: 6,
pattern111: 7
}.freeze
QRMASKCOMPUTATIONS = [
proc { |i, j| (i + j) % 2 == 0 },
proc { |i, j| i % 2 == 0 },
proc { |i, j| j % 3 == 0 },
proc { |i, j| (i + j) % 3 == 0 },
proc { |i, j| ((i / 2).floor + (j / 3).floor) % 2 == 0 },
proc { |i, j| (i * j) % 2 + (i * j) % 3 == 0 },
proc { |i, j| ((i * j) % 2 + (i * j) % 3) % 2 == 0 },
proc { |i, j| ((i * j) % 3 + (i + j) % 2) % 2 == 0 }
].freeze
QRPOSITIONPATTERNLENGTH = (7 + 1) * 2 + 1
QRFORMATINFOLENGTH = 15
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable1-e.html
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable2-e.html
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable3-e.html
# http://web.archive.org/web/20110710094955/http://www.denso-wave.com/qrcode/vertable4-e.html
QRMAXBITS = {
l: [152, 272, 440, 640, 864, 1088, 1248, 1552, 1856, 2192, 2592, 2960, 3424, 3688, 4184,
4712, 5176, 5768, 6360, 6888, 7456, 8048, 8752, 9392, 10_208, 10_960, 11_744, 12_248,
13_048, 13_880, 14_744, 15_640, 16_568, 17_528, 18_448, 19_472, 20_528, 21_616, 22_496, 23_648],
m: [128, 224, 352, 512, 688, 864, 992, 1232, 1456, 1728, 2032, 2320, 2672, 2920, 3320, 3624,
4056, 4504, 5016, 5352, 5712, 6256, 6880, 7312, 8000, 8496, 9024, 9544, 10_136, 10_984,
11_640, 12_328, 13_048, 13_800, 14_496, 15_312, 15_936, 16_816, 17_728, 18_672],
q: [104, 176, 272, 384, 496, 608, 704, 880, 1056, 1232, 1440, 1648, 1952, 2088, 2360, 2600, 2936,
3176, 3560, 3880, 4096, 4544, 4912, 5312, 5744, 6032, 6464, 6968, 7288, 7880, 8264, 8920, 9368,
9848, 10288, 10832, 11408, 12016, 12656, 13328],
h: [72, 128, 208, 288, 368, 480, 528, 688, 800, 976, 1120, 1264, 1440, 1576, 1784,
2024, 2264, 2504, 2728, 3080, 3248, 3536, 3712, 4112, 4304, 4768, 5024, 5288, 5608, 5960,
6344, 6760, 7208, 7688, 7888, 8432, 8768, 9136, 9776, 10_208]
}.freeze
# StandardErrors
class QRCodeArgumentError < ArgumentError; end
class QRCodeRunTimeError < RuntimeError; end
# == Creation
#
# QRCode objects expect only one required constructor parameter
# and an optional hash of any other. Here's a few examples:
#
# qr = RQRCodeCore::QRCode.new('hello world')
# qr = RQRCodeCore::QRCode.new('hello world', size: 1, level: :m, mode: :alphanumeric)
#
class QRCode
attr_reader :modules, :module_count, :version
# Expects a string or array (for multi-segment encoding) to be parsed in, other args are optional
#
# # data - the string, QRSegment or array of Hashes (with data:, mode: keys) you wish to encode
# # size - the size (Integer) of the QR Code (defaults to smallest size needed to encode the data)
# # max_size - the max_size (Integer) of the QR Code (default RQRCodeCore::QRUtil.max_size)
# # level - the error correction level, can be:
# * Level :l 7% of code can be restored
# * Level :m 15% of code can be restored
# * Level :q 25% of code can be restored
# * Level :h 30% of code can be restored (default :h)
# # mode - the mode of the QR Code (defaults to alphanumeric or byte_8bit, depending on the input data, only used when data is a string):
# * :number
# * :alphanumeric
# * :byte_8bit
# * :kanji
#
# qr = RQRCodeCore::QRCode.new('hello world', size: 1, level: :m, mode: :alphanumeric)
# segment_qr = QRCodeCore::QRCode.new({ data: 'foo', mode: :byte_8bit })
# multi_qr = RQRCodeCore::QRCode.new([{ data: 'foo', mode: :byte_8bit }, { data: 'bar1', mode: :alphanumeric }])
def initialize(data, *args)
options = extract_options!(args)
level = (options[:level] || :h).to_sym
max_size = options[:max_size] || QRUtil.max_size
@data = case data
when String
QRSegment.new(data: data, mode: options[:mode])
when Array
raise QRCodeArgumentError, "Array must contain Hashes with :data and :mode keys" unless data.all? { |seg| seg.is_a?(Hash) && %i[data mode].all? { |s| seg.key? s } }
data.map { |seg| QRSegment.new(**seg) }
when QRSegment
data
else
raise QRCodeArgumentError, "data must be a String, QRSegment, or an Array"
end
@error_correct_level = QRERRORCORRECTLEVEL[level]
unless @error_correct_level
raise QRCodeArgumentError, "Unknown error correction level `#{level.inspect}`"
end
size = options[:size] || minimum_version(limit: max_size)
if size > max_size
raise QRCodeArgumentError, "Given size greater than maximum possible size of #{QRUtil.max_size}"
end
@version = size
@module_count = @version * 4 + QRPOSITIONPATTERNLENGTH
@modules = Array.new(@module_count)
@data_list = multi_segment? ? QRMulti.new(@data) : @data.writer
@data_cache = nil
make
end
# checked? is called with a +col+ and +row+ parameter. This will
# return true or false based on whether that coordinate exists in the
# matrix returned. It would normally be called while iterating through
# modules. A simple example would be:
#
# instance.checked?( 10, 10 ) => true
#
def checked?(row, col)
if !row.between?(0, @module_count - 1) || !col.between?(0, @module_count - 1)
raise QRCodeRunTimeError, "Invalid row/column pair: #{row}, #{col}"
end
@modules[row][col]
end
alias_method :dark?, :checked?
extend Gem::Deprecate
deprecate :dark?, :checked?, 2020, 1
# This is a public method that returns the QR Code you have
# generated as a string. It will not be able to be read
# in this format by a QR Code reader, but will give you an
# idea if the final outout. It takes two optional args
# +:dark+ and +:light+ which are there for you to choose
# how the output looks. Here's an example of it's use:
#
# instance.to_s =>
# xxxxxxx x x x x x xx xxxxxxx
# x x xxx xxxxxx xxx x x
# x xxx x xxxxx x xx x xxx x
#
# instance.to_s( dark: 'E', light: 'Q' ) =>
# EEEEEEEQEQQEQEQQQEQEQQEEQQEEEEEEE
# EQQQQQEQQEEEQQEEEEEEQEEEQQEQQQQQE
# EQEEEQEQQEEEEEQEQQQQQQQEEQEQEEEQE
#
def to_s(*args)
options = extract_options!(args)
dark = options[:dark] || "x"
light = options[:light] || " "
quiet_zone_size = options[:quiet_zone_size] || 0
rows = []
@modules.each do |row|
cols = light * quiet_zone_size
row.each do |col|
cols += (col ? dark : light)
end
rows << cols
end
quiet_zone_size.times do
rows.unshift(light * (rows.first.length / light.size))
rows << light * (rows.first.length / light.size)
end
rows.join("\n")
end
# Public overide as default inspect is very verbose
#
# RQRCodeCore::QRCode.new('my string to generate', size: 4, level: :h)
# => QRCodeCore: @data='my string to generate', @error_correct_level=2, @version=4, @module_count=33
#
def inspect
"QRCodeCore: @data='#{@data}', @error_correct_level=#{@error_correct_level}, @version=#{@version}, @module_count=#{@module_count}"
end
# Return a symbol for current error connection level
def error_correction_level
QRERRORCORRECTLEVEL.invert[@error_correct_level]
end
# Return true if this QR Code includes multiple encoded segments
def multi_segment?
@data.is_a?(Array)
end
# Return a symbol in QRMODE.keys for current mode used
def mode
case @data_list
when QRNumeric
:mode_number
when QRAlphanumeric
:mode_alpha_numk
else
:mode_8bit_byte
end
end
protected
def make #:nodoc:
prepare_common_patterns
make_impl(false, get_best_mask_pattern)
end
private
def prepare_common_patterns #:nodoc:
@modules.map! { |row| Array.new(@module_count) }
place_position_probe_pattern(0, 0)
place_position_probe_pattern(@module_count - 7, 0)
place_position_probe_pattern(0, @module_count - 7)
place_position_adjust_pattern
place_timing_pattern
@common_patterns = @modules.map(&:clone)
end
def make_impl(test, mask_pattern) #:nodoc:
@modules = @common_patterns.map(&:clone)
place_format_info(test, mask_pattern)
place_version_info(test) if @version >= 7
if @data_cache.nil?
@data_cache = QRCode.create_data(
@version, @error_correct_level, @data_list
)
end
map_data(@data_cache, mask_pattern)
end
def place_position_probe_pattern(row, col) #:nodoc:
(-1..7).each do |r|
next unless (row + r).between?(0, @module_count - 1)
(-1..7).each do |c|
next unless (col + c).between?(0, @module_count - 1)
is_vert_line = (r.between?(0, 6) && (c == 0 || c == 6))
is_horiz_line = (c.between?(0, 6) && (r == 0 || r == 6))
is_square = r.between?(2, 4) && c.between?(2, 4)
is_part_of_probe = is_vert_line || is_horiz_line || is_square
@modules[row + r][col + c] = is_part_of_probe
end
end
end
def get_best_mask_pattern #:nodoc:
min_lost_point = 0
pattern = 0
(0...8).each do |i|
make_impl(true, i)
lost_point = QRUtil.get_lost_points(modules)
if i == 0 || min_lost_point > lost_point
min_lost_point = lost_point
pattern = i
end
end
pattern
end
def place_timing_pattern #:nodoc:
(8...@module_count - 8).each do |i|
@modules[i][6] = @modules[6][i] = i % 2 == 0
end
end
def place_position_adjust_pattern #:nodoc:
positions = QRUtil.get_pattern_positions(@version)
positions.each do |row|
positions.each do |col|
next unless @modules[row][col].nil?
(-2..2).each do |r|
(-2..2).each do |c|
is_part_of_pattern = (r.abs == 2 || c.abs == 2 || (r == 0 && c == 0))
@modules[row + r][col + c] = is_part_of_pattern
end
end
end
end
end
def place_version_info(test) #:nodoc:
bits = QRUtil.get_bch_version(@version)
(0...18).each do |i|
mod = (!test && ((bits >> i) & 1) == 1)
@modules[(i / 3).floor][ i % 3 + @module_count - 8 - 3 ] = mod
@modules[i % 3 + @module_count - 8 - 3][ (i / 3).floor ] = mod
end
end
def place_format_info(test, mask_pattern) #:nodoc:
data = (@error_correct_level << 3 | mask_pattern)
bits = QRUtil.get_bch_format_info(data)
QRFORMATINFOLENGTH.times do |i|
mod = (!test && ((bits >> i) & 1) == 1)
# vertical
row = if i < 6
i
elsif i < 8
i + 1
else
@module_count - 15 + i
end
@modules[row][8] = mod
# horizontal
col = if i < 8
@module_count - i - 1
elsif i < 9
15 - i - 1 + 1
else
15 - i - 1
end
@modules[8][col] = mod
end
# fixed module
@modules[@module_count - 8][8] = !test
end
def map_data(data, mask_pattern) #:nodoc:
inc = -1
row = @module_count - 1
bit_index = 7
byte_index = 0
(@module_count - 1).step(1, -2) do |col|
col -= 1 if col <= 6
loop do
(0...2).each do |c|
if @modules[row][col - c].nil?
dark = false
if byte_index < data.size && !data[byte_index].nil?
dark = ((QRUtil.rszf(data[byte_index], bit_index) & 1) == 1)
end
mask = QRUtil.get_mask(mask_pattern, row, col - c)
dark = !dark if mask
@modules[row][ col - c ] = dark
bit_index -= 1
if bit_index == -1
byte_index += 1
bit_index = 7
end
end
end
row += inc
if row < 0 || @module_count <= row
row -= inc
inc = -inc
break
end
end
end
end
def minimum_version(limit: QRUtil.max_size, version: 1)
raise QRCodeRunTimeError, "Data length exceed maximum capacity of version #{limit}" if version > limit
max_size_bits = QRMAXBITS[error_correction_level][version - 1]
size_bits = multi_segment? ? @data.sum { |seg| seg.size(version) } : @data.size(version)
return version if size_bits < max_size_bits
minimum_version(limit: limit, version: version + 1)
end
def extract_options!(arr) #:nodoc:
arr.last.is_a?(::Hash) ? arr.pop : {}
end
class << self
def count_max_data_bits(rs_blocks) #:nodoc:
max_data_bytes = rs_blocks.reduce(0) do |sum, rs_block|
sum + rs_block.data_count
end
max_data_bytes * 8
end
def create_data(version, error_correct_level, data_list) #:nodoc:
rs_blocks = QRRSBlock.get_rs_blocks(version, error_correct_level)
max_data_bits = QRCode.count_max_data_bits(rs_blocks)
buffer = QRBitBuffer.new(version)
data_list.write(buffer)
buffer.end_of_message(max_data_bits)
if buffer.get_length_in_bits > max_data_bits
raise QRCodeRunTimeError, "code length overflow. (#{buffer.get_length_in_bits}>#{max_data_bits}). (Try a larger size!)"
end
buffer.pad_until(max_data_bits)
QRCode.create_bytes(buffer, rs_blocks)
end
def create_bytes(buffer, rs_blocks) #:nodoc:
offset = 0
max_dc_count = 0
max_ec_count = 0
dcdata = Array.new(rs_blocks.size)
ecdata = Array.new(rs_blocks.size)
rs_blocks.each_with_index do |rs_block, r|
dc_count = rs_block.data_count
ec_count = rs_block.total_count - dc_count
max_dc_count = [max_dc_count, dc_count].max
max_ec_count = [max_ec_count, ec_count].max
dcdata_block = Array.new(dc_count)
dcdata_block.size.times do |i|
dcdata_block[i] = 0xff & buffer.buffer[i + offset]
end
dcdata[r] = dcdata_block
offset += dc_count
rs_poly = QRUtil.get_error_correct_polynomial(ec_count)
raw_poly = QRPolynomial.new(dcdata[r], rs_poly.get_length - 1)
mod_poly = raw_poly.mod(rs_poly)
ecdata_block = Array.new(rs_poly.get_length - 1)
ecdata_block.size.times do |i|
mod_index = i + mod_poly.get_length - ecdata_block.size
ecdata_block[i] = mod_index >= 0 ? mod_poly.get(mod_index) : 0
end
ecdata[r] = ecdata_block
end
total_code_count = rs_blocks.reduce(0) do |sum, rs_block|
sum + rs_block.total_count
end
data = Array.new(total_code_count)
index = 0
max_dc_count.times do |i|
rs_blocks.size.times do |r|
if i < dcdata[r].size
data[index] = dcdata[r][i]
index += 1
end
end
end
max_ec_count.times do |i|
rs_blocks.size.times do |r|
if i < ecdata[r].size
data[index] = ecdata[r][i]
index += 1
end
end
end
data
end
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_math.rb 0000664 0000000 0000000 00000001535 14111655462 0025022 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRMath
module_eval {
exp_table = Array.new(256)
log_table = Array.new(256)
(0...8).each do |i|
exp_table[i] = 1 << i
end
(8...256).each do |i|
exp_table[i] = exp_table[i - 4] \
^ exp_table[i - 5] \
^ exp_table[i - 6] \
^ exp_table[i - 8]
end
(0...255).each do |i|
log_table[exp_table[i]] = i
end
const_set(:EXP_TABLE, exp_table).freeze
const_set(:LOG_TABLE, log_table).freeze
}
class << self
def glog(n)
raise QRCodeRunTimeError, "glog(#{n})" if n < 1
LOG_TABLE[n]
end
def gexp(n)
while n < 0
n += 255
end
while n >= 256
n -= 255
end
EXP_TABLE[n]
end
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_multi.rb 0000664 0000000 0000000 00000000323 14111655462 0025215 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRMulti
def initialize(data)
@data = data
end
def write(buffer)
@data.each { |seg| seg.writer.write(buffer) }
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_numeric.rb 0000664 0000000 0000000 00000001517 14111655462 0025533 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
NUMERIC = %w[0 1 2 3 4 5 6 7 8 9].freeze
class QRNumeric
def initialize(data)
raise QRCodeArgumentError, "Not a numeric string `#{data}`" unless QRNumeric.valid_data?(data)
@data = data
end
def self.valid_data?(data)
(data.chars - NUMERIC).empty?
end
def write(buffer)
buffer.numeric_encoding_start(@data.size)
@data.size.times do |i|
if i % 3 == 0
chars = @data[i, 3]
bit_length = get_bit_length(chars.length)
buffer.put(get_code(chars), bit_length)
end
end
end
private
NUMBER_LENGTH = {
3 => 10,
2 => 7,
1 => 4
}.freeze
def get_bit_length(length)
NUMBER_LENGTH[length]
end
def get_code(chars)
chars.to_i
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_polynomial.rb 0000664 0000000 0000000 00000002435 14111655462 0026254 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRPolynomial
def initialize(num, shift)
raise QRCodeRunTimeError, "#{num.size}/#{shift}" if num.empty?
offset = 0
while offset < num.size && num[offset] == 0
offset += 1
end
@num = Array.new(num.size - offset + shift)
(0...num.size - offset).each do |i|
@num[i] = num[i + offset]
end
end
def get(index)
@num[index]
end
def get_length
@num.size
end
def multiply(e)
num = Array.new(get_length + e.get_length - 1)
(0...get_length).each do |i|
(0...e.get_length).each do |j|
tmp = num[i + j].nil? ? 0 : num[i + j]
num[i + j] = tmp ^ QRMath.gexp(QRMath.glog(get(i)) + QRMath.glog(e.get(j)))
end
end
QRPolynomial.new(num, 0)
end
def mod(e)
if get_length - e.get_length < 0
return self
end
ratio = QRMath.glog(get(0)) - QRMath.glog(e.get(0))
num = Array.new(get_length)
(0...get_length).each do |i|
num[i] = get(i)
end
(0...e.get_length).each do |i|
tmp = num[i].nil? ? 0 : num[i]
num[i] = tmp ^ QRMath.gexp(QRMath.glog(e.get(i)) + ratio)
end
QRPolynomial.new(num, 0).mod(e)
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_rs_block.rb 0000664 0000000 0000000 00000014761 14111655462 0025674 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRRSBlock
attr_reader :data_count, :total_count
def initialize(total_count, data_count)
@total_count = total_count
@data_count = data_count
end
# http://www.thonky.com/qr-code-tutorial/error-correction-table/
RS_BLOCK_TABLE = [
# L
# M
# Q
# H
# 1
[1, 26, 19],
[1, 26, 16],
[1, 26, 13],
[1, 26, 9],
# 2
[1, 44, 34],
[1, 44, 28],
[1, 44, 22],
[1, 44, 16],
# 3
[1, 70, 55],
[1, 70, 44],
[2, 35, 17],
[2, 35, 13],
# 4
[1, 100, 80],
[2, 50, 32],
[2, 50, 24],
[4, 25, 9],
# 5
[1, 134, 108],
[2, 67, 43],
[2, 33, 15, 2, 34, 16],
[2, 33, 11, 2, 34, 12],
# 6
[2, 86, 68],
[4, 43, 27],
[4, 43, 19],
[4, 43, 15],
# 7
[2, 98, 78],
[4, 49, 31],
[2, 32, 14, 4, 33, 15],
[4, 39, 13, 1, 40, 14],
# 8
[2, 121, 97],
[2, 60, 38, 2, 61, 39],
[4, 40, 18, 2, 41, 19],
[4, 40, 14, 2, 41, 15],
# 9
[2, 146, 116],
[3, 58, 36, 2, 59, 37],
[4, 36, 16, 4, 37, 17],
[4, 36, 12, 4, 37, 13],
# 10
[2, 86, 68, 2, 87, 69],
[4, 69, 43, 1, 70, 44],
[6, 43, 19, 2, 44, 20],
[6, 43, 15, 2, 44, 16],
# 11
[4, 101, 81],
[1, 80, 50, 4, 81, 51],
[4, 50, 22, 4, 51, 23],
[3, 36, 12, 8, 37, 13],
# 12
[2, 116, 92, 2, 117, 93],
[6, 58, 36, 2, 59, 37],
[4, 46, 20, 6, 47, 21],
[7, 42, 14, 4, 43, 15],
# 13
[4, 133, 107],
[8, 59, 37, 1, 60, 38],
[8, 44, 20, 4, 45, 21],
[12, 33, 11, 4, 34, 12],
# 14
[3, 145, 115, 1, 146, 116],
[4, 64, 40, 5, 65, 41],
[11, 36, 16, 5, 37, 17],
[11, 36, 12, 5, 37, 13],
# 15
[5, 109, 87, 1, 110, 88],
[5, 65, 41, 5, 66, 42],
[5, 54, 24, 7, 55, 25],
[11, 36, 12, 7, 37, 13],
# 16
[5, 122, 98, 1, 123, 99],
[7, 73, 45, 3, 74, 46],
[15, 43, 19, 2, 44, 20],
[3, 45, 15, 13, 46, 16],
# 17
[1, 135, 107, 5, 136, 108],
[10, 74, 46, 1, 75, 47],
[1, 50, 22, 15, 51, 23],
[2, 42, 14, 17, 43, 15],
# 18
[5, 150, 120, 1, 151, 121],
[9, 69, 43, 4, 70, 44],
[17, 50, 22, 1, 51, 23],
[2, 42, 14, 19, 43, 15],
# 19
[3, 141, 113, 4, 142, 114],
[3, 70, 44, 11, 71, 45],
[17, 47, 21, 4, 48, 22],
[9, 39, 13, 16, 40, 14],
# 20
[3, 135, 107, 5, 136, 108],
[3, 67, 41, 13, 68, 42],
[15, 54, 24, 5, 55, 25],
[15, 43, 15, 10, 44, 16],
# 21
[4, 144, 116, 4, 145, 117],
[17, 68, 42],
[17, 50, 22, 6, 51, 23],
[19, 46, 16, 6, 47, 17],
# 22
[2, 139, 111, 7, 140, 112],
[17, 74, 46],
[7, 54, 24, 16, 55, 25],
[34, 37, 13],
# 23
[4, 151, 121, 5, 152, 122],
[4, 75, 47, 14, 76, 48],
[11, 54, 24, 14, 55, 25],
[16, 45, 15, 14, 46, 16],
# 24
[6, 147, 117, 4, 148, 118],
[6, 73, 45, 14, 74, 46],
[11, 54, 24, 16, 55, 25],
[30, 46, 16, 2, 47, 17],
# 25
[8, 132, 106, 4, 133, 107],
[8, 75, 47, 13, 76, 48],
[7, 54, 24, 22, 55, 25],
[22, 45, 15, 13, 46, 16],
# 26
[10, 142, 114, 2, 143, 115],
[19, 74, 46, 4, 75, 47],
[28, 50, 22, 6, 51, 23],
[33, 46, 16, 4, 47, 17],
# 27
[8, 152, 122, 4, 153, 123],
[22, 73, 45, 3, 74, 46],
[8, 53, 23, 26, 54, 24],
[12, 45, 15, 28, 46, 16],
# 28
[3, 147, 117, 10, 148, 118],
[3, 73, 45, 23, 74, 46],
[4, 54, 24, 31, 55, 25],
[11, 45, 15, 31, 46, 16],
# 29
[7, 146, 116, 7, 147, 117],
[21, 73, 45, 7, 74, 46],
[1, 53, 23, 37, 54, 24],
[19, 45, 15, 26, 46, 16],
# 30
[5, 145, 115, 10, 146, 116],
[19, 75, 47, 10, 76, 48],
[15, 54, 24, 25, 55, 25],
[23, 45, 15, 25, 46, 16],
# 31
[13, 145, 115, 3, 146, 116],
[2, 74, 46, 29, 75, 47],
[42, 54, 24, 1, 55, 25],
[23, 45, 15, 28, 46, 16],
# 32
[17, 145, 115],
[10, 74, 46, 23, 75, 47],
[10, 54, 24, 35, 55, 25],
[19, 45, 15, 35, 46, 16],
# 33
[17, 145, 115, 1, 146, 116],
[14, 74, 46, 21, 75, 47],
[29, 54, 24, 19, 55, 25],
[11, 45, 15, 46, 46, 16],
# 34
[13, 145, 115, 6, 146, 116],
[14, 74, 46, 23, 75, 47],
[44, 54, 24, 7, 55, 25],
[59, 46, 16, 1, 47, 17],
# 35
[12, 151, 121, 7, 152, 122],
[12, 75, 47, 26, 76, 48],
[39, 54, 24, 14, 55, 25],
[22, 45, 15, 41, 46, 16],
# 36
[6, 151, 121, 14, 152, 122],
[6, 75, 47, 34, 76, 48],
[46, 54, 24, 10, 55, 25],
[2, 45, 15, 64, 46, 16],
# 37
[17, 152, 122, 4, 153, 123],
[29, 74, 46, 14, 75, 47],
[49, 54, 24, 10, 55, 25],
[24, 45, 15, 46, 46, 16],
# 38
[4, 152, 122, 18, 153, 123],
[13, 74, 46, 32, 75, 47],
[48, 54, 24, 14, 55, 25],
[42, 45, 15, 32, 46, 16],
# 39
[20, 147, 117, 4, 148, 118],
[40, 75, 47, 7, 76, 48],
[43, 54, 24, 22, 55, 25],
[10, 45, 15, 67, 46, 16],
# 40
[19, 148, 118, 6, 149, 119],
[18, 75, 47, 31, 76, 48],
[34, 54, 24, 34, 55, 25],
[20, 45, 15, 61, 46, 16]
].freeze
def self.get_rs_blocks(version, error_correct_level)
rs_block = QRRSBlock.get_rs_block_table(version, error_correct_level)
if rs_block.nil?
raise QRCodeRunTimeError,
"bad rsblock @ version: #{version}/error_correct_level:#{error_correct_level}"
end
length = rs_block.size / 3
list = []
(0...length).each do |i|
count = rs_block[i * 3 + 0]
total_count = rs_block[i * 3 + 1]
data_count = rs_block[i * 3 + 2]
(0...count).each do |j|
list << QRRSBlock.new(total_count, data_count)
end
end
list
end
def self.get_rs_block_table(version, error_correct_level)
case error_correct_level
when QRERRORCORRECTLEVEL[:l]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 0]
when QRERRORCORRECTLEVEL[:m]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 1]
when QRERRORCORRECTLEVEL[:q]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 2]
when QRERRORCORRECTLEVEL[:h]
QRRSBlock::RS_BLOCK_TABLE[(version - 1) * 4 + 3]
end
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_segment.rb 0000664 0000000 0000000 00000002555 14111655462 0025536 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRSegment
attr_reader :data, :mode
def initialize(data:, mode: nil)
@data = data
@mode = QRMODE_NAME.dig(mode&.to_sym)
# If mode is not explicitely found choose mode according to data type
@mode ||= if RQRCodeCore::QRNumeric.valid_data?(@data)
QRMODE_NAME[:number]
elsif QRAlphanumeric.valid_data?(@data)
QRMODE_NAME[:alphanumeric]
else
QRMODE_NAME[:byte_8bit]
end
end
def size(version)
4 + header_size(version) + content_size
end
def header_size(version)
QRUtil.get_length_in_bits(QRMODE[mode], version)
end
def content_size
chunk_size, bit_length, extra = case mode
when :mode_number
[3, QRNumeric::NUMBER_LENGTH[3], QRNumeric::NUMBER_LENGTH[data_length % 3] || 0]
when :mode_alpha_numk
[2, 11, 6]
when :mode_8bit_byte
[1, 8, 0]
end
(data_length / chunk_size) * bit_length + ((data_length % chunk_size) == 0 ? 0 : extra)
end
def writer
case mode
when :mode_number
QRNumeric.new(data)
when :mode_alpha_numk
QRAlphanumeric.new(data)
when :mode_multi
QRMulti.new(data)
else
QR8bitByte.new(data)
end
end
private
def data_length
data.bytesize
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/qrcode/qr_util.rb 0000664 0000000 0000000 00000014774 14111655462 0025057 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
class QRUtil
PATTERN_POSITION_TABLE = [
[],
[6, 18],
[6, 22],
[6, 26],
[6, 30],
[6, 34],
[6, 22, 38],
[6, 24, 42],
[6, 26, 46],
[6, 28, 50],
[6, 30, 54],
[6, 32, 58],
[6, 34, 62],
[6, 26, 46, 66],
[6, 26, 48, 70],
[6, 26, 50, 74],
[6, 30, 54, 78],
[6, 30, 56, 82],
[6, 30, 58, 86],
[6, 34, 62, 90],
[6, 28, 50, 72, 94],
[6, 26, 50, 74, 98],
[6, 30, 54, 78, 102],
[6, 28, 54, 80, 106],
[6, 32, 58, 84, 110],
[6, 30, 58, 86, 114],
[6, 34, 62, 90, 118],
[6, 26, 50, 74, 98, 122],
[6, 30, 54, 78, 102, 126],
[6, 26, 52, 78, 104, 130],
[6, 30, 56, 82, 108, 134],
[6, 34, 60, 86, 112, 138],
[6, 30, 58, 86, 114, 142],
[6, 34, 62, 90, 118, 146],
[6, 30, 54, 78, 102, 126, 150],
[6, 24, 50, 76, 102, 128, 154],
[6, 28, 54, 80, 106, 132, 158],
[6, 32, 58, 84, 110, 136, 162],
[6, 26, 54, 82, 110, 138, 166],
[6, 30, 58, 86, 114, 142, 170]
].freeze
G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0
G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0
G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1
DEMERIT_POINTS_1 = 3
DEMERIT_POINTS_2 = 3
DEMERIT_POINTS_3 = 40
DEMERIT_POINTS_4 = 10
BITS_FOR_MODE = {
QRMODE[:mode_number] => [10, 12, 14],
QRMODE[:mode_alpha_numk] => [9, 11, 13],
QRMODE[:mode_8bit_byte] => [8, 16, 16],
QRMODE[:mode_kanji] => [8, 10, 12]
}.freeze
def self.max_size
PATTERN_POSITION_TABLE.count
end
def self.get_bch_format_info(data)
d = data << 10
while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15) >= 0
d ^= (G15 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G15)))
end
((data << 10) | d) ^ G15_MASK
end
def self.rszf(num, count)
# zero fill right shift
(num >> count) & ((2**((num.size * 8) - count)) - 1)
end
def self.get_bch_version(data)
d = data << 12
while QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18) >= 0
d ^= (G18 << (QRUtil.get_bch_digit(d) - QRUtil.get_bch_digit(G18)))
end
(data << 12) | d
end
def self.get_bch_digit(data)
digit = 0
while data != 0
digit += 1
data = QRUtil.rszf(data, 1)
end
digit
end
def self.get_pattern_positions(version)
PATTERN_POSITION_TABLE[version - 1]
end
def self.get_mask(mask_pattern, i, j)
if mask_pattern > QRMASKCOMPUTATIONS.size
raise QRCodeRunTimeError, "bad mask_pattern: #{mask_pattern}"
end
QRMASKCOMPUTATIONS[mask_pattern].call(i, j)
end
def self.get_error_correct_polynomial(error_correct_length)
a = QRPolynomial.new([1], 0)
(0...error_correct_length).each do |i|
a = a.multiply(QRPolynomial.new([1, QRMath.gexp(i)], 0))
end
a
end
def self.get_length_in_bits(mode, version)
if !QRMODE.value?(mode)
raise QRCodeRunTimeError, "Unknown mode: #{mode}"
end
if version > 40
raise QRCodeRunTimeError, "Unknown version: #{version}"
end
if version.between?(1, 9)
# 1 - 9
macro_version = 0
elsif version <= 26
# 10 - 26
macro_version = 1
elsif version <= 40
# 27 - 40
macro_version = 2
end
BITS_FOR_MODE[mode][macro_version]
end
def self.get_lost_points(modules)
demerit_points = 0
demerit_points += QRUtil.demerit_points_1_same_color(modules)
demerit_points += QRUtil.demerit_points_2_full_blocks(modules)
demerit_points += QRUtil.demerit_points_3_dangerous_patterns(modules)
demerit_points += QRUtil.demerit_points_4_dark_ratio(modules)
demerit_points
end
def self.demerit_points_1_same_color(modules)
demerit_points = 0
module_count = modules.size
# level1
(0...module_count).each do |row|
(0...module_count).each do |col|
same_count = 0
dark = modules[row][col]
(-1..1).each do |r|
next if row + r < 0 || module_count <= row + r
(-1..1).each do |c|
next if col + c < 0 || module_count <= col + c
next if r == 0 && c == 0
if dark == modules[row + r][col + c]
same_count += 1
end
end
end
if same_count > 5
demerit_points += (DEMERIT_POINTS_1 + same_count - 5)
end
end
end
demerit_points
end
def self.demerit_points_2_full_blocks(modules)
demerit_points = 0
module_count = modules.size
# level 2
(0...(module_count - 1)).each do |row|
(0...(module_count - 1)).each do |col|
count = 0
count += 1 if modules[row][col]
count += 1 if modules[row + 1][col]
count += 1 if modules[row][col + 1]
count += 1 if modules[row + 1][col + 1]
if count == 0 || count == 4
demerit_points += DEMERIT_POINTS_2
end
end
end
demerit_points
end
def self.demerit_points_3_dangerous_patterns(modules)
demerit_points = 0
module_count = modules.size
# level 3
modules.each do |row|
(module_count - 6).times do |col_idx|
if row[col_idx] &&
!row[col_idx + 1] &&
row[col_idx + 2] &&
row[col_idx + 3] &&
row[col_idx + 4] &&
!row[col_idx + 5] &&
row[col_idx + 6]
demerit_points += DEMERIT_POINTS_3
end
end
end
(0...module_count).each do |col|
(0...(module_count - 6)).each do |row|
if modules[row][col] &&
!modules[row + 1][col] &&
modules[row + 2][col] &&
modules[row + 3][col] &&
modules[row + 4][col] &&
!modules[row + 5][col] &&
modules[row + 6][col]
demerit_points += DEMERIT_POINTS_3
end
end
end
demerit_points
end
def self.demerit_points_4_dark_ratio(modules)
# level 4
dark_count = modules.reduce(0) do |sum, col|
sum + col.count(true)
end
ratio = dark_count / (modules.size * modules.size)
ratio_delta = (100 * ratio - 50).abs / 5
ratio_delta * DEMERIT_POINTS_4
end
end
end
whomwah-rqrcode_core-f6b9c9b/lib/rqrcode_core/version.rb 0000664 0000000 0000000 00000000112 14111655462 0023565 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
module RQRCodeCore
VERSION = "1.2.0"
end
whomwah-rqrcode_core-f6b9c9b/rqrcode_core.gemspec 0000664 0000000 0000000 00000002277 14111655462 0022370 0 ustar 00root root 0000000 0000000 lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "rqrcode_core/version"
Gem::Specification.new do |spec|
spec.name = "rqrcode_core"
spec.version = RQRCodeCore::VERSION
spec.platform = Gem::Platform::RUBY
spec.authors = ["Duncan Robertson"]
spec.email = ["duncan@whomwah.com"]
spec.summary = "A library to encode QR Codes"
spec.description = <<~EOF
rqrcode_core is a Ruby library for encoding QR Codes. The simple
interface (with no runtime dependencies) allows you to create QR Code data structures.
EOF
spec.homepage = "https://github.com/whomwah/rqrcode_core"
spec.license = "MIT"
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
end
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.required_ruby_version = ">= 2.3"
spec.add_development_dependency "bundler", "~> 2.0"
spec.add_development_dependency "rake", "~> 13.0"
spec.add_development_dependency "minitest", "~> 5.0"
spec.add_development_dependency "standardrb", "~> 1.0"
end
whomwah-rqrcode_core-f6b9c9b/test/ 0000775 0000000 0000000 00000000000 14111655462 0017323 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/test/benchmark.rb 0000664 0000000 0000000 00000000377 14111655462 0021611 0 ustar 00root root 0000000 0000000 $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
require "rqrcode_core"
require "benchmark"
Benchmark.bm do |benchmark|
benchmark.report("RQRCode") do
1000.times do
RQRCodeCore::QRCode.new("https://kyan.com").to_s
end
end
end
whomwah-rqrcode_core-f6b9c9b/test/rqrcode_core/ 0000775 0000000 0000000 00000000000 14111655462 0021772 5 ustar 00root root 0000000 0000000 whomwah-rqrcode_core-f6b9c9b/test/rqrcode_core/data.rb 0000664 0000000 0000000 00000234534 14111655462 0023243 0 ustar 00root root 0000000 0000000 MATRIX_1_H = [[true, true, true, true, true, true, true, false, true, true, false, true, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, true, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, false, false, false], [false, false, false, false, false, true, true, false, false, true, false, true, false, false, true, false, true, false, true, false, true], [true, true, true, true, true, false, false, true, false, false, true, false, false, true, true, false, true, true, true, true, false], [false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, false, true, true, true, true, false], [false, true, false, false, true, false, false, false, true, false, false, false, true, false, true, false, true, true, true, false, false], [false, true, true, false, false, true, true, false, true, true, false, false, false, false, false, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, false, true, false, false, true, false, true, true, false, false, false, true, false], [true, false, false, false, false, false, true, false, true, true, true, false, false, true, false, false, false, true, true, false, false], [true, false, true, true, true, false, true, false, false, false, false, false, false, false, true, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, false, false, true, false, false, true, true, false, true, false, true, false, false], [true, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, false, true, true, false, true, true, false, false], [true, true, true, true, true, true, true, false, false, true, false, true, false, false, false, true, false, false, false, true, false]]
MATRIX_3_H = [[true, true, true, true, true, true, true, false, false, true, true, true, true, false, true, true, false, true, true, false, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, true, false, false, false, false, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, false, true, false, false, false, false, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, true, true, true, true, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, false, false, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false], [false, false, true, true, false, false, true, true, true, false, true, false, false, true, false, true, false, false, false, true, true, true, true, false, true, false, false, false, false], [true, false, true, false, false, true, false, true, false, true, true, false, false, false, true, true, false, false, false, false, false, false, false, false, true, false, false, false, true], [true, false, true, true, false, true, true, false, false, true, true, true, true, true, false, false, true, false, true, false, false, true, true, false, false, true, true, true, false], [false, false, false, false, true, true, false, false, false, true, true, true, true, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true], [false, false, true, true, true, true, true, false, false, false, false, true, true, true, false, false, true, true, false, false, false, true, false, false, false, true, false, false, false], [false, true, true, true, true, false, false, true, true, false, true, true, false, true, true, false, true, false, false, false, false, false, false, false, false, true, true, false, false], [false, true, true, true, true, false, true, false, true, false, true, true, false, false, true, true, true, true, false, false, false, true, false, true, false, false, false, true, false], [true, false, true, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, false, true, true, true, true, false, true, true, false, true, true], [false, true, true, true, false, false, true, false, true, true, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, false, false, true, true], [false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, true, true, true, false, true, true, false, true, true, true, false, true, false, false], [true, false, false, true, false, true, true, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, true, false, false, false, true, false, false], [false, false, true, true, true, true, false, false, false, true, true, false, true, false, true, true, true, true, true, true, false, false, true, false, true, true, false, false, true], [false, true, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, false, false, true, true, true, true, true, true, false, true, true], [false, false, false, false, false, false, false, false, true, true, false, true, true, true, true, true, false, true, true, true, true, false, false, false, true, true, true, false, false], [true, true, true, true, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, false, true, false, true, false, false, false, false], [true, false, false, false, false, false, true, false, false, true, false, false, true, false, true, false, false, true, false, true, true, false, false, false, true, false, false, true, true], [true, false, true, true, true, false, true, false, false, true, false, false, true, true, false, true, false, false, true, false, true, true, true, true, true, false, true, true, false], [true, false, true, true, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true, true, true, true, true, true, true, false, true, false, false], [true, false, true, true, true, false, true, false, true, false, true, true, true, false, true, true, false, true, false, true, false, false, true, true, false, false, false, false, true], [true, false, false, false, false, false, true, false, false, false, false, false, false, true, false, true, true, true, true, true, false, true, false, true, false, false, false, true, false], [true, true, true, true, true, true, true, false, false, false, true, true, true, false, false, true, false, false, true, false, true, true, false, true, false, true, true, true, false]]
MATRIX_5_H = [[true, true, true, true, true, true, true, false, false, true, false, true, false, false, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, true, true, true, false, true, true, true, true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, true, false, false, true, false, true, true, false, true, true, true, true, false, false, true, true, false, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, false, true, false, true, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, false, true, false, false, false, false, true, true, true, false, true, true, true, true, true, true, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, false, true, true, true, true, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, true, true, false, true, true, false, true, false, true, true, true, false, false, false, false, false, false, false, false], [false, false, false, true, true, false, true, true, false, true, false, true, false, false, true, true, false, true, false, true, false, false, true, true, true, true, true, false, false, false, false, false, false, true, true, false, false], [false, false, false, true, false, true, false, false, false, false, true, true, true, true, false, true, false, true, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, true, true], [false, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, true, true, false, false, true, false, true, false, true, false, true, true, true, true, true, false, false, false, false, true, true], [true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, false, false, false, false, true, false, true, false, false, true, true, false, true, false, true], [true, false, true, true, false, false, true, true, false, true, true, true, true, false, true, true, false, true, true, false, false, true, false, true, true, true, true, true, false, false, true, true, true, false, true, true, true], [true, false, false, true, true, false, false, false, true, false, false, false, true, false, true, true, true, true, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, true, false, false, true], [true, true, true, true, true, true, true, true, false, true, true, true, false, false, true, false, false, false, false, false, false, true, true, true, true, false, true, true, false, true, false, true, true, true, true, true, false], [true, true, false, false, true, true, false, true, false, true, true, false, false, true, true, true, true, false, true, false, false, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false], [false, true, true, false, true, false, true, false, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, true, true, false, false, true, false, false, false, true, true, false, true, false, false], [true, false, false, true, true, true, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false], [false, true, false, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, true, false, false, false, false, false, false, true, true, false, true, true, true, false, true, false, true, false, true], [true, true, true, false, true, true, false, false, true, true, true, true, true, true, true, true, false, true, true, false, false, false, false, false, false, true, false, true, true, true, true, true, true, false, false, false, false], [false, false, false, false, false, true, true, true, false, false, true, true, true, true, true, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, true, false, true, true, true], [true, true, true, false, true, true, false, false, true, true, true, true, false, false, false, false, false, true, true, false, true, true, false, false, true, false, false, false, true, true, true, true, true, true, false, false, true], [false, false, true, false, false, false, true, false, false, true, true, true, true, false, true, true, false, true, true, true, false, false, true, false, true, false, true, true, false, true, true, false, false, true, true, false, false], [true, false, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, true, false, true, true, true, false, true, true, false, false, true, true, true, true, false, true, false], [false, false, false, true, false, true, true, true, false, false, false, false, false, true, false, true, false, false, true, true, true, true, true, false, false, true, true, false, true, true, true, false, true, true, true, false, false], [true, false, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, true, false, true, false, false, false, true, true, true, true, true, true, true, false, true], [true, true, true, true, false, false, true, false, true, false, true, false, false, true, false, false, false, true, false, true, false, false, true, false, false, false, true, false, true, false, true, false, false, true, false, true, false], [true, false, false, false, false, false, false, false, true, true, false, false, true, true, false, false, true, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, true, true, false, false, false], [true, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, false, true, true, false, true, true, true, false, false, false, false, true, true, true, true, true, true, false, false, false], [false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true, true, false, false, false, true, true, false, false, false, true, false, false, false, true, true, true, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, true, true, false, true, true, true, true, false, true, false, true, false, true, true, true], [true, false, false, false, false, false, true, false, false, true, true, false, false, true, false, false, false, true, true, true, true, true, false, false, true, true, false, true, true, false, false, false, true, true, false, true, true], [true, false, true, true, true, false, true, false, true, false, false, true, false, true, true, false, false, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, true], [true, false, true, true, true, false, true, false, true, true, true, true, true, true, false, false, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, true, true, true, false, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, true, false, false, false, true, false, true, true, true, true, true, false, true, false, true, true], [true, true, true, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, true, false, true]]
MATRIX_10_H = [[true, true, true, true, true, true, true, false, false, true, false, true, true, true, true, false, false, true, false, true, true, false, true, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, false, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, true, true, true, true, true, true, true, true, true, true, false, false, true, false, true, false, true, false, true, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, false, true, true, false, false, true, true, true, false, true, false, true, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, false, true, true, true, true, true, false, false, true, false, false, true, false, true, true, true, false, false, true, false, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, true, true, true, true, true, true, false, true, false, true, true, false, false, true, true, false, true, true, false, false, true, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, true, true, true, false, true, true, true, true, true, false, false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, true, true, false, true, false, true, false, true, false, true, true, false, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, true, false, false, false, true, false, false, false, false, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, false, false, false, false, false, false, false], [false, false, true, true, false, false, true, true, true, false, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false, false, true, true, true, true, true, true, true, false, true, true, false, true, true, false, true, false, true, false, true, true, true, false, false, true, true, false, true, false, false, false, false], [false, true, true, false, false, false, false, true, false, false, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, true, false, true, true, false, true, true, true, false, true, false, true, true, false, false, true, false, false, true, true, false, true, false, true, true, true, true, true, false, true, false], [true, true, false, false, false, true, true, true, false, false, false, false, true, true, false, true, true, false, false, true, true, true, false, true, true, false, false, false, true, true, false, true, true, true, false, true, true, false, true, false, false, true, false, true, false, true, false, true, true, false, true, true, true, true, true, false, true], [true, true, true, true, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, true, true, false, false, false, true, false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, false, false, true, false, false, true, true, true, true, false, false, false, true, true, false, false], [false, true, true, true, true, false, true, true, true, false, false, false, true, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, true, true, false, true, false, true, false, false, false, true, false, false, true, true, true, true, true, false, false, true, true, true, false, false, false, false, true, false, false], [true, true, true, true, false, true, false, false, true, false, false, false, false, false, false, false, true, true, true, false, false, false, true, false, true, true, true, true, true, true, true, true, false, true, true, false, true, false, true, false, true, true, false, false, false, true, false, true, false, false, true, true, false, true, false, false, true], [false, true, true, true, true, true, true, false, false, true, false, true, true, true, false, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, true, true, true, true, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, true, true, true, false, false, true], [false, true, false, false, true, false, false, false, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, false, false, true, true, true, false, false, true, false, false, true, true, true, false, false, true, false, true, false, true, false, false, true, true, true, true, false, false, true, false, true], [false, false, true, true, true, true, true, false, true, true, false, false, false, false, false, false, true, true, true, false, true, true, true, false, false, true, true, true, false, true, true, true, false, false, false, false, false, false, false, false, false, true, true, false, true, true, false, true, false, false, false, true, true, false, false, true, false], [true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, true, true, false, true, false, false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, false, false, false, true, true, true, false, true, false, false, true, true, false, false], [true, true, true, false, false, true, true, true, true, true, false, true, false, false, false, true, true, true, true, true, false, true, true, true, false, false, true, true, false, true, false, true, true, false, false, false, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false], [false, true, false, true, true, true, false, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, false, false, false, true, true, true], [false, false, true, false, false, true, true, false, true, true, true, false, false, true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false], [true, false, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, true, true, false, true, true, false, false, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, true, false, false, false], [false, true, false, true, true, false, true, true, true, true, true, false, true, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, false, true, false, false, false, false, false, true, true, true, true, true, true, false, true], [false, true, false, true, false, false, false, true, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, false, false, true, false, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, true, false, false, false, true, true, true, true, true, true, false], [true, false, false, false, true, true, true, false, false, false, false, true, false, false, true, false, false, false, false, true, false, false, true, false, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false], [true, false, true, false, true, false, false, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, false, true, false, true, true, false, false, false, true, true, false, true, false, false, false, true, true], [false, false, true, true, true, true, true, true, true, false, true, true, false, true, false, false, true, true, false, true, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, false, true, true, false, false, true, true, false, true, false, true, true, false, true, true, true, true, true, false, true, true, false], [true, true, true, false, true, false, false, false, true, true, true, true, true, true, true, true, false, true, true, true, true, true, false, false, false, true, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, false, true, true, true, true, false], [false, true, false, false, true, false, true, false, true, true, false, false, false, false, true, true, false, false, true, false, false, true, true, false, false, true, true, false, true, false, true, false, false, false, false, true, false, true, true, false, false, true, true, true, false, false, true, false, true, false, true, false, true, true, true, false, true], [false, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, true, false, false, false, false, false, true, true, true, false, false, false, true, true, true, false, true, false, true, true, false, true, true, true, true, true, true, true, false, true, true, false, false, false, true, true, true, false, false], [true, true, true, false, true, true, true, true, true, true, false, true, false, false, false, false, true, false, false, false, true, false, true, false, true, true, true, true, true, true, true, true, false, true, true, false, false, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, false, false, false, false], [false, false, true, true, true, false, false, true, false, false, true, false, true, false, false, false, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, true, false, false, false, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true], [false, true, false, false, true, false, true, false, false, false, true, true, false, true, false, true, true, true, true, true, true, true, false, false, false, true, true, false, false, true, false, false, true, false, true, false, false, true, true, true, false, true, false, true, false, true, true, false, true, true, false, false, true, false, false, true, false], [false, false, true, false, true, false, false, false, true, true, false, false, true, true, true, true, false, false, false, true, false, false, true, true, false, true, true, false, false, false, true, true, true, true, false, false, true, true, true, true, true, false, true, true, false, true, false, true, true, true, false, false, true, false, true, false, false], [false, true, true, false, true, true, true, false, false, false, false, false, true, false, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, true, false, false, false, true, false, true, false, true, true, true, false, false, false, true, true, false, true, false, false, true, false, true, false, false, true, false], [false, false, false, true, true, false, false, false, true, false, false, true, true, false, true, false, true, false, true, false, false, false, true, false, true, false, true, false, false, false, true, true, true, false, true, false, false, true, false, true, true, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, true], [true, true, true, true, true, false, true, true, true, true, false, true, true, false, false, false, false, true, false, false, true, false, true, true, true, false, false, false, true, false, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, true, true, true, true, false, false, false, false, true, true, true, true], [false, false, true, false, true, false, false, false, false, false, false, false, true, true, false, true, false, true, true, true, false, false, true, true, true, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, false, false, true, false, false, true, true, false, true, true, true, false, false, false, true, true, true], [false, false, true, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, false, true, false, true, true, false, true, false, true, true, false, true, true, false], [false, false, false, false, true, true, false, true, true, false, false, false, false, false, true, true, true, false, false, true, true, false, false, false, true, false, false, true, false, true, true, true, true, true, true, true, false, false, false, true, false, false, true, true, false, false, true, false, false, true, false, true, false, true, false, true, false], [true, false, false, false, false, true, true, true, false, false, false, false, true, false, true, true, false, true, false, false, false, true, true, true, true, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, false, false, true], [true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, true, true, false, true, true, false, true, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false], [true, true, true, false, true, false, true, true, false, true, false, false, true, false, false, true, false, false, false, false, false, true, true, true, false, false, false, true, true, true, false, false, true, true, true, false, true, true, false, false, true, true, true, false, false, true, false, true, false, true, false, true, true, true, true, true, true], [true, false, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, true, false, true, false, false, true, true, true, true, true, true, false, false, false, true, true, true, false, false, false], [true, true, true, true, false, false, true, true, true, false, false, true, false, true, false, false, false, true, true, true, true, true, false, false, false, false, true, true, false, false, false, true, true, false, true, false, false, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, true, true, false, false, true], [false, false, true, false, true, true, false, false, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, false, true, false, false, true, true, true, false, false, true, false, true, false, true, false, false, true, true, false, true, false, true, false, true, false], [true, false, true, false, false, true, true, true, true, false, false, true, false, false, true, true, false, true, false, false, false, false, false, false, false, false, true, false, true, true, true, true, false, false, true, true, true, false, true, false, false, true, false, false, true, false, false, true, false, false, true, true, false, true, true, false, true], [true, true, true, true, true, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, true, false, false, true, false, true, false, true, true, true, false, false, true, false, false, true, true, false, true, false, true, false, false, true, false, true, false, false, true, false, false, false, true, true, true, false, false], [false, false, false, false, false, false, true, true, false, false, true, true, false, true, true, true, true, true, false, false, true, false, false, false, true, false, true, true, true, true, true, false, true, false, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false], [false, false, false, false, false, false, false, false, true, true, false, false, true, true, true, false, false, true, true, true, false, false, true, false, false, true, true, false, false, false, true, true, false, true, false, true, true, true, false, false, true, true, false, false, false, true, true, true, true, false, false, false, true, true, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, false, true, false, true, true, false, true, true, false, false, true, true, false, true, true, false, true, false, true, false, true, false, false, false, false, true, false, true, false, true, false, false, true, false, true, true, true, false, true, false, true, true, false, false, true], [true, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, false, true, true, true, true, true, true, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, true, false, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, false, true, false, false, false, false, true, true, true, true, true, false, false, false, false, true, false, false, true, false, false, true, true, false, true, true, false, false, true, true, true, true, true, false, false, true, false], [true, false, true, true, true, false, true, false, true, false, false, true, true, false, false, true, false, true, false, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, true, true, false, false, false, true, true, false, false, true, true, false, false, false, true, false], [true, false, true, true, true, false, true, false, true, true, false, false, true, true, false, true, true, false, true, false, true, false, false, false, false, true, true, true, false, false, true, true, true, true, true, false, false, false, false, true, false, false, true, false, false, false, false, false, true, false, true, false, false, true, true, false, false], [true, false, false, false, false, false, true, false, false, false, false, true, true, false, false, false, true, true, true, true, false, false, false, true, false, false, false, false, true, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, false, true, false, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, false, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, true, true, true, true, false, true, false, false, true, false, true, false, true, true, true, false, false, true, false, true, false, false, false, false, true, false, true, true, true, false, false, false]]
MATRIX_4_H = [[true, true, true, true, true, true, true, false, false, true, true, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, false, false, true, true, false, false, true, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, false, true, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, true, false, true, false, false, true, false, true, true, false, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, true, false, true, false, false, false, false, false, true, true, true, false, true, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true, true, true, false, true, true, true, false, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, true, true, true, false, false, false, false, false, false, false, false], [false, false, true, true, false, false, true, true, true, true, false, false, false, false, true, true, true, false, false, false, false, true, true, true, true, true, true, false, true, false, false, false, false], [false, true, true, true, false, false, false, true, false, false, false, false, false, false, true, false, true, false, true, true, false, true, false, true, false, false, true, true, false, true, true, false, true], [true, false, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, true, false, true, true, true], [false, false, true, true, false, true, false, true, true, true, true, true, false, true, true, true, true, false, true, false, false, false, false, false, true, false, false, true, true, true, false, false, true], [true, false, false, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, false, true, false, false, false, true, false, false, true, true, false, false, false], [false, false, false, true, true, true, false, true, false, true, false, false, false, true, false, false, true, true, false, false, true, false, false, false, true, false, false, false, false, true, false, true, false], [false, false, false, false, true, false, true, true, false, false, true, true, true, true, true, false, false, true, false, true, false, true, true, false, true, false, true, true, true, false, false, false, false], [true, true, true, true, true, true, false, false, false, true, false, false, false, false, false, true, false, false, true, false, true, true, true, true, false, true, false, true, true, false, true, true, false], [true, false, false, true, false, false, true, false, false, true, false, true, true, false, true, false, true, false, false, true, false, true, false, false, false, true, true, false, true, false, true, false, true], [false, true, false, false, true, false, false, false, false, true, true, false, false, false, true, false, true, true, true, true, false, false, true, true, true, true, true, true, true, true, false, false, true], [false, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, true, true, false, false, false, true, false, false, false, false, true, false, false, false], [true, false, true, true, true, true, false, false, true, false, false, false, false, true, true, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false], [false, false, true, false, true, false, true, true, true, false, false, true, true, false, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, true, false], [true, true, false, false, true, false, false, false, false, true, true, true, false, true, false, true, false, true, false, true, false, false, false, true, false, false, true, false, false, true, false, false, true], [false, false, true, true, false, false, true, false, true, false, false, true, false, true, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, false, true, true, true], [false, true, false, false, true, true, false, false, false, false, true, true, true, false, true, false, true, false, true, true, true, false, false, true, false, true, true, true, false, false, false, false, true], [true, false, false, true, false, true, true, false, false, false, false, true, false, false, false, false, false, true, true, true, false, false, true, false, true, true, true, true, true, false, false, true, true], [false, false, false, false, false, false, false, false, true, false, true, true, false, false, false, true, true, true, false, false, true, true, false, true, true, false, false, false, true, true, false, false, false], [true, true, true, true, true, true, true, false, true, true, true, false, false, true, true, false, true, true, true, false, true, true, false, true, true, false, true, false, true, false, true, false, false], [true, false, false, false, false, false, true, false, false, false, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, false, false, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, true, true, true, true, false, true, true, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, false], [true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, false, true, false, true, false, false, false, true, true, false, false, false, true, false, false, false, true, true], [true, false, true, true, true, false, true, false, true, true, true, true, false, false, true, true, true, false, false, true, false, true, true, true, false, false, true, false, false, false, true, false, false], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, true], [true, true, true, true, true, true, true, false, false, true, true, false, false, true, false, false, false, true, true, true, false, true, false, false, false, false, true, true, true, true, true, false, false]]
MATRIX_1_L = [[true, true, true, true, true, true, true, false, false, true, true, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, true, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, true, false, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, true, true, true, false, false, false, false, false, false, false, false], [true, true, false, false, false, true, true, true, false, true, false, false, true, false, false, false, true, true, false, false, false], [false, true, true, false, true, true, false, true, true, true, true, false, true, false, true, false, true, true, true, true, false], [true, false, false, false, false, false, true, false, true, false, false, true, false, true, false, false, true, true, true, true, false], [false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, true, true, true, false, false], [true, true, false, true, false, true, true, false, true, false, true, false, false, false, true, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, false, true, true, true, true, true, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, true, true, false, false, true, false, true, true, false, false, false, true, false], [true, false, false, false, false, false, true, false, true, true, true, true, true, true, false, false, false, true, true, false, false], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false, false], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, false, true, true, false, false], [true, true, true, true, true, true, true, false, true, false, false, true, false, true, false, true, false, false, false, true, false]]
MATRIX_1_M = [[true, true, true, true, true, true, true, false, true, false, true, false, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, true, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false], [true, false, true, false, false, false, true, true, false, true, false, true, true, false, false, true, false, false, true, false, true], [false, false, true, true, true, true, false, true, true, true, false, false, false, false, false, false, false, true, false, true, true], [true, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, false, false, true, false, true], [false, false, true, true, true, true, false, true, true, true, true, false, true, false, false, false, true, true, false, false, false], [false, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, true, false, true, false, true, true, false, false, true, true, false, true], [true, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, true, false, false, true], [true, false, false, false, false, false, true, false, false, false, true, true, false, true, true, false, true, true, false, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, true, true, true, false, false, true, false, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false], [true, false, true, true, true, false, true, false, true, true, true, false, false, false, true, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false], [true, true, true, true, true, true, true, false, true, true, false, false, false, false, true, true, true, true, false, false, true]]
MATRIX_1_Q = [[true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false], [false, true, false, false, false, false, true, true, true, true, false, false, true, true, false, false, false, false, false, true, true], [false, true, true, true, false, false, false, false, false, true, true, true, true, false, true, false, true, true, true, true, false], [false, false, false, false, false, true, true, true, true, false, false, true, false, true, false, false, true, true, true, true, false], [true, false, false, true, true, true, false, false, false, true, false, true, false, false, false, false, true, true, true, false, false], [false, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true], [false, false, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true, false, false, true], [true, true, true, true, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, false], [true, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, false, true, true, false, false], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, true, false, true, false, false], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, true, true], [true, false, false, false, false, false, true, false, true, true, false, false, false, false, false, true, false, true, true, false, false], [true, true, true, true, true, true, true, false, false, true, false, true, false, true, false, true, false, false, false, true, false]]
MATRIX_4_L = [[true, true, true, true, true, true, true, false, true, true, true, false, true, false, false, false, false, true, false, true, true, false, true, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, true, true, false, false, false, false, false, true, true, false, true, false, false, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, true, false, true, true, false, false, false, false, true, true, true, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, false, true, false, false, true, true, true, true, true, false, false, false, true, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, false, false, false, true, true, false, true, false, true, true, false, true, true, true, true, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, true, false, false, true, true, true, true, true, false, false, true, false, true, false, false, false, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, false, true, false, false, true, false, true, false, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false], [true, true, false, false, true, true, true, false, false, false, false, true, false, true, true, true, true, false, true, false, false, true, false, false, true, false, false, true, false, true, true, true, true], [true, false, true, true, true, true, false, true, false, true, true, false, true, false, false, false, false, true, false, true, true, false, true, true, false, false, false, true, false, false, true, true, false], [false, true, true, true, false, false, true, true, true, false, false, true, true, true, true, true, false, false, true, false, true, true, true, true, true, false, false, true, true, true, true, true, false], [true, true, true, true, true, true, false, true, true, false, true, true, false, true, false, true, true, false, false, false, false, true, true, false, true, false, true, true, true, false, false, false, true], [false, true, false, true, true, true, true, true, true, false, true, false, true, true, false, false, false, false, false, true, true, true, true, true, true, false, true, true, true, false, false, false, false], [false, true, false, true, false, false, false, false, true, true, false, false, false, true, true, false, true, false, true, true, false, false, false, true, true, true, false, true, false, false, true, true, false], [false, true, true, false, true, true, true, true, false, false, false, false, false, false, false, false, true, true, false, true, false, false, true, true, true, true, true, false, false, true, true, false, false], [true, true, false, false, true, false, false, false, true, true, true, false, true, false, true, false, false, true, true, true, true, true, true, false, false, true, true, false, false, false, false, true, true], [false, false, false, true, false, true, true, false, true, true, true, true, false, true, true, true, true, false, true, false, false, true, true, false, false, false, true, false, true, false, false, false, true], [false, true, true, true, true, true, false, true, false, true, true, false, true, false, false, false, false, true, false, true, true, true, false, true, false, true, false, false, false, false, true, false, false], [true, false, false, true, false, true, true, false, true, false, true, true, true, true, true, true, false, false, true, false, true, true, false, true, true, true, false, false, false, false, true, true, false], [false, true, false, true, false, true, false, false, true, false, false, true, false, true, false, true, true, false, false, false, false, true, true, true, true, true, true, true, false, true, false, true, true], [true, false, false, false, false, true, true, false, false, true, true, false, true, true, false, false, false, false, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true], [true, false, false, true, true, false, false, true, true, false, false, false, false, true, true, false, true, false, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false], [false, false, false, false, false, true, true, true, true, false, true, false, false, false, false, false, true, true, false, true, false, false, false, true, true, false, false, false, true, true, true, true, false], [false, false, false, true, true, true, false, true, true, false, false, false, true, false, true, false, false, true, true, true, true, true, false, true, true, false, true, false, true, false, false, true, true], [true, true, false, true, false, true, true, false, false, false, true, true, false, true, true, true, true, false, true, false, false, false, false, true, true, true, true, true, true, false, false, false, true], [false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, false, true, true, true, false, false, true, false, false, false, true, false, true, false, false], [true, true, true, true, true, true, true, false, false, false, true, true, true, true, true, true, false, false, true, false, true, false, false, false, true, false, true, false, true, false, true, true, false], [true, false, false, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false], [true, false, true, true, true, false, true, false, true, false, false, false, true, true, false, false, false, false, false, true, true, false, true, false, true, true, true, true, true, false, false, true, true], [true, false, true, true, true, false, true, false, false, true, false, false, false, true, true, false, true, false, true, true, false, false, false, true, true, false, true, true, true, true, false, true, false], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, false, false, true, true, false, true, false, true, true, false, true, false, true, false, true, false, true, false, false], [true, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false, false, true, true, true, true, true, false, true, true, false, false, true, false, true, false, false, false], [true, true, true, true, true, true, true, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, false, true, true, false, true, true, true, false, false, false, true]]
MATRIX_4_M = [[true, true, true, true, true, true, true, false, true, true, false, true, false, true, false, true, false, false, true, false, false, false, false, true, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, false, false, false, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, true, true, false, false, false, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, true, true, false, false, false, false, false, true, true, false, true, false, true, true, false, false, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, false, true, true, false, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, true, true, false, false, true, true, true, true, false, false, false, false, true, true, true, true, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, true, true, true, true, true, false, false, true, false, false, false, false, false, false, false, false], [true, false, false, false, true, false, true, true, true, false, true, false, true, false, false, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, false, false, true], [true, true, false, true, false, false, false, true, false, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, false, true, false, false, false, true, true, true, true], [false, false, false, false, true, false, true, false, true, false, false, false, true, true, true, true, true, false, true, false, true, false, false, true, true, false, false, false, false, false, true, false, false], [true, false, true, true, true, true, false, true, true, false, true, true, true, true, false, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, false, true, true], [false, true, true, true, false, true, true, true, true, true, true, true, true, true, false, false, true, false, false, true, false, false, true, false, false, true, true, false, false, true, false, false, true], [true, false, true, true, false, true, false, true, true, false, false, false, true, true, true, false, false, false, true, true, true, false, false, false, true, false, true, true, true, true, false, false, false], [false, true, true, true, false, true, true, false, false, false, true, false, false, true, false, true, false, true, true, false, true, true, true, true, true, true, true, true, false, true, true, true, false], [true, true, false, false, true, false, false, false, false, false, true, true, true, true, false, true, true, true, true, false, false, true, true, true, false, false, true, false, false, false, true, true, true], [false, true, true, true, false, false, true, true, true, false, false, true, true, false, false, false, true, true, false, true, true, true, true, false, false, false, true, false, true, false, true, false, true], [false, false, true, true, true, false, false, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, true, true, false, true, false, true, false, true, true, false, false], [false, false, false, true, false, true, true, true, true, true, true, false, true, true, false, true, true, true, false, false, false, true, true, true, false, true, true, true, false, false, true, true, false], [true, true, false, true, false, false, false, true, false, true, false, false, true, true, true, true, true, true, true, true, false, true, false, false, true, false, true, true, true, true, false, false, false], [false, false, true, false, false, true, true, false, false, false, true, true, false, true, true, false, false, false, true, true, true, false, false, true, true, false, false, true, false, false, false, false, false], [true, true, true, true, false, false, false, false, true, true, true, true, true, false, true, false, true, false, false, true, false, false, true, false, false, true, true, false, false, false, true, false, false], [false, false, false, true, true, true, true, true, true, false, false, true, true, false, true, false, true, false, false, true, false, false, true, false, false, false, false, false, true, false, false, true, false], [false, false, false, false, false, true, false, false, false, true, true, true, false, false, true, false, false, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, false], [true, true, true, true, true, false, true, true, false, false, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, true, false, true, true, false, false, true, false, false, true, false, false, false, true, true, false, true, false], [true, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, false, false, false, true, false, true, false, true, true, true, true, false], [true, false, false, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, true, true, false, true, true, true, false, false, false, true, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, true, true, true, false, true, false, false, true, false, false, true, false, true, true, true, true, true, false, false, true, true], [true, false, true, true, true, false, true, false, false, false, true, true, true, true, true, false, false, true, true, true, true, true, false, true, false, false, true, false, true, true, false, true, false], [true, false, true, true, true, false, true, false, false, true, false, true, true, false, false, true, false, false, true, false, true, false, false, false, true, false, true, false, true, true, true, false, false], [true, false, false, false, false, false, true, false, false, true, true, false, false, false, false, true, true, true, true, false, false, true, false, false, false, false, false, true, false, false, true, false, false], [true, true, true, true, true, true, true, false, true, true, true, true, false, true, true, false, false, true, false, true, true, true, true, false, true, false, true, false, false, false, true, false, true]]
MATRIX_4_Q = [[true, true, true, true, true, true, true, false, false, true, true, true, false, true, true, true, false, true, true, false, false, true, true, false, true, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, true, true, false, false, false, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, false, false, true, true, true, false, true, false, false, false, false, true, true, true, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, false, true, true, true, false, true, false, true, true, true, false, true, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, false, true, true, false, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, true, false, true, true, true, true, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false], [false, true, false, true, true, true, true, false, true, false, false, false, true, true, false, false, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, true, false], [false, false, false, true, true, true, false, false, true, true, false, false, true, false, false, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, true, false, false], [true, false, false, false, true, false, true, false, true, false, true, false, true, true, true, false, true, false, false, false, false, false, true, true, false, false, true, false, true, false, false, true, true], [false, false, false, true, true, false, false, false, false, true, false, false, true, false, true, false, false, false, true, false, false, true, true, true, false, false, true, false, true, false, true, true, true], [true, true, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, false], [true, false, false, false, true, false, false, false, true, false, false, true, true, false, false, true, false, false, true, true, true, false, false, false, true, true, false, true, false, false, true, false, false], [true, false, true, false, true, true, true, true, false, false, false, false, true, false, true, false, true, true, true, true, true, true, true, false, false, false, true, true, true, false, false, false, false], [true, false, true, true, false, false, false, false, false, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, true, true, false], [false, false, true, false, false, false, true, false, true, false, true, false, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, true, false, false, true, true], [true, true, false, false, true, false, false, true, false, true, true, false, false, true, false, true, false, true, false, true, true, false, false, false, false, false, true, true, true, false, true, false, true], [true, false, true, true, true, true, true, true, true, false, false, false, true, true, true, false, true, false, false, true, true, true, true, true, true, false, false, true, false, false, false, true, true], [true, false, false, false, true, true, false, false, true, true, false, true, false, false, false, true, true, true, true, false, true, false, true, true, false, true, true, false, false, false, true, false, false], [true, false, true, true, false, true, true, false, true, false, true, true, false, false, false, true, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, true, false], [true, false, true, false, true, true, false, false, false, true, false, false, false, true, false, false, true, false, true, false, false, false, false, false, false, true, false, false, true, false, true, true, false], [true, false, false, false, true, false, true, false, true, true, false, true, false, false, false, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, true, true, true], [true, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, false, true, true, true, true, false, true, false, false, true, true, false, false, true, true, true, false], [true, true, true, false, false, true, true, false, true, true, false, false, true, true, false, false, false, false, true, false, false, false, false, false, true, true, true, true, true, false, false, true, true], [false, false, false, false, false, false, false, false, true, true, false, false, true, false, true, true, true, false, false, false, false, true, false, false, true, false, false, false, true, true, false, false, false], [true, true, true, true, true, true, true, false, false, true, false, true, true, true, true, true, true, false, true, true, true, false, false, true, true, false, true, false, true, false, false, false, false], [true, false, false, false, false, false, true, false, true, true, false, true, true, true, false, false, true, false, false, true, false, true, true, false, true, false, false, false, true, true, true, true, true], [true, false, true, true, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, false, false, true, true, true, true, true, true, true, true, true, false, true, true], [true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, true, false, false, true, false, false, false, true, true, false, true], [true, false, true, true, true, false, true, false, false, true, true, false, true, true, false, false, true, true, true, true, false, false, false, false, false, true, false, false, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, true, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true], [true, true, true, true, true, true, true, false, false, true, true, false, true, true, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, false, false, false]]
MATRIX_UTF8_RU_TEST = [[true, true, true, true, true, true, true, false, true, false, true, true, true, true, true, false, false, false, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, true, true, true, true, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, false, true, true, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, false, false, true, false, true, true, false, true, true, false, true, false, true, true, true, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, true, false, false, true, true, false, true, false, false, true, false, false, false, false, false, true], [true, true, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true], [false, false, false, false, false, false, false, false, true, true, true, false, false, false, false, true, true, false, false, false, false, false, false, false, false], [false, false, false, false, false, true, true, false, false, false, true, false, true, true, false, true, false, false, true, false, true, false, true, false, true], [false, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, false, true, true, false, false, true, true, true], [false, true, true, false, true, true, true, false, false, false, false, false, false, true, false, false, false, false, true, false, true, true, false, true, false], [true, true, false, false, true, false, false, false, false, false, true, false, false, false, false, true, false, true, true, true, true, false, true, false, false], [false, false, false, false, false, false, true, true, false, false, false, false, true, true, false, false, false, true, true, true, true, false, false, true, true], [true, true, true, true, false, true, false, false, false, true, false, true, false, false, true, false, false, true, true, false, false, true, false, false, true], [true, false, false, true, true, false, true, true, true, false, false, true, true, true, false, true, true, true, false, false, true, false, false, false, false], [true, false, false, false, false, false, false, false, true, true, false, false, false, true, false, false, true, false, false, false, true, true, false, true, true], [true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, false, true], [false, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, true, false, false, false, true, false, false, true, true], [true, true, true, true, true, true, true, false, false, true, true, true, false, true, false, true, true, false, true, false, true, false, true, false, false], [true, false, false, false, false, false, true, false, true, true, false, false, true, false, true, true, true, false, false, false, true, false, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, true, true, false, false, false, true, true, true, true, true, true, false, false, false], [true, false, true, true, true, false, true, false, false, true, true, true, true, true, false, false, false, true, false, false, true, false, true, false, true], [true, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, true, false, true, false, true, false, false, false, true], [true, false, false, false, false, false, true, false, false, true, false, false, false, false, true, true, false, false, true, true, false, true, true, false, true], [true, true, true, true, true, true, true, false, false, true, false, true, false, false, false, true, true, false, true, true, true, false, true, false, true]]
whomwah-rqrcode_core-f6b9c9b/test/rqrcode_core/qr_segment_test.rb 0000664 0000000 0000000 00000001356 14111655462 0025527 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require "test_helper"
class RQRCodeCore::QRSegmentTest < Minitest::Test
PAYLOAD = [{data: "byteencoded", mode: :byte_8bit}, {data: "A1" * 107, mode: :alphanumeric}, {data: "1" * 498, mode: :number}]
def test_multi_payloads
RQRCodeCore::QRCode.new(PAYLOAD, level: :l)
RQRCodeCore::QRCode.new(PAYLOAD, level: :m)
RQRCodeCore::QRCode.new(PAYLOAD, level: :q)
RQRCodeCore::QRCode.new(PAYLOAD)
RQRCodeCore::QRCode.new(PAYLOAD, level: :l, max_size: 22)
rescue => e
flunk(e)
end
def test_invalid_code_configs
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new(:not_a_string_or_array)
RQRCodeCore::QRCode.new(PAYLOAD << :not_a_segment)
}
end
end
whomwah-rqrcode_core-f6b9c9b/test/rqrcode_core/regresions_test.rb 0000664 0000000 0000000 00000000342 14111655462 0025535 0 ustar 00root root 0000000 0000000 require "test_helper"
class RegresionTests < Minitest::Test
# Rs block information was incomplete.
def test_code_length_overflow_bug
RQRCodeCore::QRCode.new("s" * 220)
RQRCodeCore::QRCode.new("s" * 195)
end
end
whomwah-rqrcode_core-f6b9c9b/test/rqrcode_core/rqrcode_test.rb 0000664 0000000 0000000 00000012362 14111655462 0025021 0 ustar 00root root 0000000 0000000 require "test_helper"
class RQRCodeCore::BaseTest < Minitest::Test
require_relative "data"
def test_no_data_given
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new(size: 1, level: :h)
RQRCodeCore::QRCode.new(size: 1)
RQRCodeCore::QRCode.new
}
assert_raises(RQRCodeCore::QRCodeRunTimeError) {
qr = RQRCodeCore::QRCode.new("duncan")
qr.checked?(0, 999999)
}
end
def test_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 1)
assert_equal qr.modules.size, 21
assert_equal qr.modules, MATRIX_1_H
qr = RQRCodeCore::QRCode.new("duncan", size: 1)
assert_equal qr.modules, MATRIX_1_H
qr = RQRCodeCore::QRCode.new("duncan", size: 1, level: :l)
assert_equal qr.modules, MATRIX_1_L
qr = RQRCodeCore::QRCode.new("duncan", size: 1, level: :m)
assert_equal qr.modules, MATRIX_1_M
qr = RQRCodeCore::QRCode.new("duncan", size: 1, level: :q)
assert_equal qr.modules, MATRIX_1_Q
end
def test_3_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 3)
assert_equal qr.modules.size, 29
assert_equal qr.modules, MATRIX_3_H
end
def test_5_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 5)
assert_equal qr.modules.size, 37
assert_equal qr.modules, MATRIX_5_H
end
def test_10_H_
qr = RQRCodeCore::QRCode.new("duncan", size: 10)
assert_equal qr.modules.size, 57
assert_equal qr.modules, MATRIX_10_H
end
def test_4_H_
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw", level: :l, size: 4)
assert_equal qr.modules, MATRIX_4_L
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw", level: :m, size: 4)
assert_equal qr.modules, MATRIX_4_M
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw", level: :q, size: 4)
assert_equal qr.modules, MATRIX_4_Q
qr = RQRCodeCore::QRCode.new("www.bbc.co.uk/programmes/b0090blw")
assert_equal qr.modules.size, 33
assert_equal qr.modules, MATRIX_4_H
end
def test_to_s
qr = RQRCodeCore::QRCode.new("duncan", size: 1)
assert_equal "xxxxxxx xx x xxxxxxx\n", qr.to_s[0..21]
assert_equal "qqqqqqqnqqnqnnqqqqqqq\n", qr.to_s(dark: "q", light: "n")[0..21]
assert_equal "@@@@@@@ @@ @ @@@@@@@\n", qr.to_s(dark: "@")[0..21]
end
def test_auto_alphanumeric
# Overflowws without the alpha version
assert RQRCodeCore::QRCode.new("1234567890", size: 1, level: :h)
qr = RQRCodeCore::QRCode.new("DUNCAN", size: 1, level: :h)
assert_equal "xxxxxxx xxx xxxxxxx\n", qr.to_s[0..21]
end
def test_manual_alphanumeric
assert_equal :mode_alpha_numk, RQRCodeCore::QRCode.new("DUNCAN", mode: :alphanumeric).mode
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new("Duncan", mode: :alphanumeric)
}
end
def test_auto_numeric
# When digit only automatically uses numeric mode, default ecc level is :h
digits = RQRCodeCore::QRCode.new("1" * 17) # Version 1, numeric mode, ECC h
assert_equal 1, digits.version
assert_equal :mode_number, digits.mode
assert_equal :h, digits.error_correction_level
# When alpha automatically works
alpha = RQRCodeCore::QRCode.new("X" * 10) # Version 1, alpha mode, ECC h
assert_equal 1, alpha.version
assert_equal :mode_alpha_numk, alpha.mode
assert_equal :h, alpha.error_correction_level
# Generic should use binary
binary = RQRCodeCore::QRCode.new("x" * 7) # Version 1, 8bit mode, ECC h
assert_equal 1, binary.version
assert_equal :mode_8bit_byte, binary.mode
assert_equal :h, binary.error_correction_level
end
def test_numeric_2_M
data = "279042272585972554922067893753871413584876543211601021503002"
qr = RQRCodeCore::QRCode.new(data, size: 2, level: :m, mode: :number)
assert_equal "xxxxxxx x x x xxxxxxx\n", qr.to_s[0..25]
end
def test_rszf_error_not_thrown
assert RQRCodeCore::QRCode.new("2 1058 657682")
assert RQRCodeCore::QRCode.new("40952", size: 1, level: :h)
assert RQRCodeCore::QRCode.new("40932", size: 1, level: :h)
end
def test_exceed_max_size
assert_raises RQRCodeCore::QRCodeArgumentError do
RQRCodeCore::QRCode.new("duncan", size: 41)
end
end
def test_error_correction_level
# attr_reader was wrong
assert_equal RQRCodeCore::QRCode.new("a", level: :h).error_correction_level, :h
end
def test_version_table
# tables in RQRCodeCore::QRCode::QRMAXBITS wasn't updated to support greater versions
assert_equal RQRCodeCore::QRCode.new("1" * 289, level: :h, mode: :number).version, 11
assert_equal RQRCodeCore::QRCode.new("A" * 175, level: :h, mode: :alphanumeric).version, 11
assert_equal RQRCodeCore::QRCode.new("a" * 383, level: :h, mode: :byte_8bit).version, 21
end
def test_levels
assert RQRCodeCore::QRCode.new("duncan", level: :l)
assert RQRCodeCore::QRCode.new("duncan", level: :m)
assert RQRCodeCore::QRCode.new("duncan", level: :q)
assert RQRCodeCore::QRCode.new("duncan", level: :h)
%w[a b c d e f g i j k n o p r s t u v w x y z].each do |ltr|
assert_raises(RQRCodeCore::QRCodeArgumentError) {
RQRCodeCore::QRCode.new("duncan", level: ltr.to_sym)
}
end
end
def test_utf8
qr = RQRCodeCore::QRCode.new("ัะตัั")
assert_equal qr.modules, MATRIX_UTF8_RU_TEST
end
end
whomwah-rqrcode_core-f6b9c9b/test/test_helper.rb 0000664 0000000 0000000 00000000112 14111655462 0022160 0 ustar 00root root 0000000 0000000 require "bundler/setup"
require "rqrcode_core"
require "minitest/autorun"