From 736c0861c83c0f0128851809f3d0eae38001824b Mon Sep 17 00:00:00 2001 From: Jessie Hildebrandt Date: Sat, 11 Dec 2021 20:42:02 -0500 Subject: [PATCH] Add testing --- .busted | 5 + .gitignore | 5 +- .gitlab-ci.yml | 11 ++ .luacov | 4 + README.md | 16 +++ rockspec/qrprinter-1.1-0.rockspec | 45 +++++++ spec/encode_string_spec.lua | 97 +++++++++++++++ spec/expected_output/print_qr_ansi.txt | 25 ++++ spec/expected_output/print_qr_ascii.txt | 25 ++++ spec/expected_output/print_qr_invert_true.txt | 25 ++++ spec/expected_output/print_qr_padding_0.txt | 21 ++++ spec/expected_output/print_qr_padding_3.txt | 27 ++++ spec/expected_output/print_qr_utf8.txt | 25 ++++ spec/print_qr_spec.lua | 116 ++++++++++++++++++ 14 files changed, 446 insertions(+), 1 deletion(-) create mode 100644 .busted create mode 100644 .gitlab-ci.yml create mode 100644 .luacov create mode 100644 rockspec/qrprinter-1.1-0.rockspec create mode 100644 spec/encode_string_spec.lua create mode 100644 spec/expected_output/print_qr_ansi.txt create mode 100644 spec/expected_output/print_qr_ascii.txt create mode 100644 spec/expected_output/print_qr_invert_true.txt create mode 100644 spec/expected_output/print_qr_padding_0.txt create mode 100644 spec/expected_output/print_qr_padding_3.txt create mode 100644 spec/expected_output/print_qr_utf8.txt create mode 100644 spec/print_qr_spec.lua diff --git a/.busted b/.busted new file mode 100644 index 0000000..2c78f5d --- /dev/null +++ b/.busted @@ -0,0 +1,5 @@ +return { + default = { + coverage = true + } +} diff --git a/.gitignore b/.gitignore index 6d58440..e355fba 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,7 @@ build/ # Luarocks source tree files -*.src.rock \ No newline at end of file +*.src.rock + +# luacov report files +luacov.* \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..3ee2b29 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,11 @@ +image: jessiehildebrandt/luadev:luajit + +test: + script: + - luarocks build + - luarocks test + - luacov + - cat luacov.report.out + artifacts: + paths: + - luacov.report.out diff --git a/.luacov b/.luacov new file mode 100644 index 0000000..c1111bb --- /dev/null +++ b/.luacov @@ -0,0 +1,4 @@ +modules = { + ["qrprinter"] = "build/qrprinter.lua", + ["qrprinter.ffi.qrencode"] = "build/ffi/qrencode.lua", +} diff --git a/README.md b/README.md index 8604a21..633a40a 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,12 @@ A wrapper for `libqrencode` that provides an easy way of encoding and printing strings as QR codes from Lua. +**This uses LuaJIT's FFI library, and so will not run in PUC Lua implementations.** + Written in [Fennel](https://fennel-lang.org). +[![Test Status](https://gitlab.com/jessieh/qrprinter/badges/main/pipeline.svg)](https://gitlab.com/jessieh/qrprinter/-/commits/main) [![Code Coverage](https://gitlab.com/jessieh/qrprinter/badges/main/coverage.svg)](https://gitlab.com/jessieh/qrprinter/-/commits/main) + ## Installation Install dependencies: @@ -69,3 +73,15 @@ Print `qr` to `stdout` using ANSI escape sequences. qrprinter.print_qr_utf8( qr, [options] ) ``` Print `qr` to `stdout` using UTF8 block elements. + +## Testing + +The Fennel code needs to be compiled before tests can be run: + +```bash +# Build the project: +luarocks build + +# Now you can run tests: +luarocks test +``` diff --git a/rockspec/qrprinter-1.1-0.rockspec b/rockspec/qrprinter-1.1-0.rockspec new file mode 100644 index 0000000..772b375 --- /dev/null +++ b/rockspec/qrprinter-1.1-0.rockspec @@ -0,0 +1,45 @@ +package = 'qrprinter' +version = '1.1-0' +rockspec_format = '3.0' +supported_platforms = {'linux'} +source = { + url = "git+https://gitlab.com/jessieh/qrprinter", + tag = "1.1-0" +} +description = { + summary = "Encode and print strings as QR codes.", + detailed = "qrprinter wraps the libqrencode C library using LuaJIT's FFI to provide an easy way of encoding and printing strings as QR codes from Lua.", + homepage = "https://gitlab.com/jessieh/qrprinter", + maintainer = "Jessie Hildebrandt ", + license = "GPLv3" +} +dependencies = { + "lua >= 5.1", + "luajit >= 2.0" +} +external_dependencies = { + LIBQRENCODE = { + header = "qrencode.h" + } +} +test = { + type = 'busted' +} +test_dependencies = { + 'busted = 2.0.0-1', + 'luacov = 0.15.0-1' +} +build = { + type = "make", + makefile = "Makefile", + build_variables = { + -- This suppresses luarocks' CFLAGS warning-- we don't actually use this + CFLAGS = "$(CFLAGS)" + }, + install = { + lua = { + ["qrprinter"] = "build/qrprinter.lua", + ["qrprinter.ffi.qrencode"] = "build/ffi/qrencode.lua" + } + } +} diff --git a/spec/encode_string_spec.lua b/spec/encode_string_spec.lua new file mode 100644 index 0000000..533be1a --- /dev/null +++ b/spec/encode_string_spec.lua @@ -0,0 +1,97 @@ +-- spec/encode_string_spec.lua +-- Specifies tests for qrprinter.encode_string functionality + +-------------------------------------------------------------------------------- +-- Disable LuaJIT compiler + +-- LuaJIT's optimizations can frob luacov's coverage reports +require( 'jit' ).off() + +-------------------------------------------------------------------------------- +-- Module imports + +qrprinter = require( 'qrprinter' ) + +-------------------------------------------------------------------------------- +-- Test context + +describe( 'qrprinter.encode_string functionality', function () + + ---------------------------------------- + -- Test definitions + + it( 'returns nil for empty strings', function() + + local expected_value = nil + + local empty_string = '' + + assert.are.same( expected_value, qrprinter.encode_string( empty_string ) ) + + end ) + + it( 'encodes alphanumeric strings', function() + + local expected_value = { + { true, true, true, true, true, true, true, false, false, true, false, false, true, false, true, true, true, true, true, true, true }, + { true, false, false, false, false, false, true, false, true, false, 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, false, false, true, false, false, true, false, true, true, true, false, true }, + { true, false, true, true, true, false, true, false, false, false, true, true, true, false, true, false, true, true, true, false, true }, + { true, false, false, false, false, false, true, false, true, true, 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, false, true, true, true, false, false, false, false, false, false, false, false }, + { true, true, true, true, true, false, true, true, true, true, false, false, true, true, false, true, false, true, false, true, false }, + { false, false, true, true, false, false, false, false, false, true, false, false, true, false, false, true, false, false, true, false, true }, + { true, false, false, false, false, true, true, false, false, false, true, true, false, true, false, false, true, false, false, true, false }, + { true, true, true, true, true, false, false, false, false, true, false, false, false, false, false, true, true, true, true, true, false }, + { true, false, false, false, true, true, true, true, false, false, true, true, false, true, false, false, true, false, false, false, false }, + { false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, false, false, true, false, true }, + { true, true, true, true, true, true, true, false, true, true, false, false, true, false, true, true, false, true, false, true, false }, + { true, false, false, false, false, false, true, false, false, false, true, true, true, true, true, false, true, false, true, false, true }, + { true, false, true, true, true, false, true, false, true, false, true, false, true, false, false, true, false, true, false, true, false }, + { true, false, true, true, true, false, true, false, true, true, false, false, true, false, false, false, true, false, true, false, false }, + { true, false, true, true, true, false, true, false, true, false, true, true, false, true, false, true, false, true, true, false, false }, + { true, false, false, false, false, false, true, false, true, false, true, false, false, false, false, true, true, false, true, false, false }, + { true, true, true, true, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, true, false } + } + + local test_string = 'abc123' + + assert.are.same( expected_value, qrprinter.encode_string( test_string ) ) + + end ) + + it( 'encodes UTF-8 strings', function() + + local expected_value = { + { true, true, true, true, true, true, true, false, false, false, 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, true, false, false, false, false, false, true }, + { true, false, true, true, true, false, true, false, true, false, true, false, false, 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, false, true, false, true, 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, false, false, false, false, false, false, false, false, false, false }, + { true, true, true, false, true, true, true, true, true, false, true, false, true, true, true, false, false, false, true, false, false }, + { false, false, true, false, false, true, false, true, false, true, false, true, false, false, false, false, true, false, true, false, false }, + { false, true, true, false, true, false, true, false, true, true, false, true, false, true, true, false, false, true, false, false, false }, + { false, false, true, false, false, false, false, true, true, true, true, true, true, false, true, true, false, true, true, true, false }, + { true, true, true, false, true, true, true, false, false, false, false, true, false, true, false, true, true, true, true, false, true }, + { false, false, false, false, false, false, false, false, true, true, false, true, false, true, false, false, false, true, false, false, true }, + { true, true, true, true, true, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, false }, + { true, false, false, false, false, false, true, false, true, true, false, false, true, true, true, false, true, true, true, true, false }, + { true, false, true, true, true, false, true, false, true, false, false, true, true, true, true, true, false, true, true, true, false }, + { true, false, true, true, true, false, true, false, false, true, false, false, true, false, true, false, false, true, true, true, false }, + { true, false, true, true, true, false, true, false, true, false, true, false, false, true, false, false, false, true, true, false, true }, + { true, false, false, false, false, false, true, false, true, true, false, true, false, true, true, true, false, false, true, true, false }, + { true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, false, true, true, false, true, true } + } + + local test_string = '💙🔵🔷' + + assert.are.same( expected_value, qrprinter.encode_string( test_string ) ) + + end ) + +end ) diff --git a/spec/expected_output/print_qr_ansi.txt b/spec/expected_output/print_qr_ansi.txt new file mode 100644 index 0000000..af45d64 --- /dev/null +++ b/spec/expected_output/print_qr_ansi.txt @@ -0,0 +1,25 @@ +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          diff --git a/spec/expected_output/print_qr_ascii.txt b/spec/expected_output/print_qr_ascii.txt new file mode 100644 index 0000000..c1aa552 --- /dev/null +++ b/spec/expected_output/print_qr_ascii.txt @@ -0,0 +1,25 @@ +################################################## +################################################## +#### #### #### ## #### +#### ########## ## #### #### ########## #### +#### ## ## #### ######## ## ## #### +#### ## ## ## #### #### ## ## #### +#### ## ## ###### ## ## ## #### +#### ########## ## ## ## ########## #### +#### ## ## ## ## #### +######################## #################### +#### ## #### ## ## ## ###### +######## ########## #### #### #### ## #### +#### ######## ###### ## #### #### ###### +#### ######## ########## ###### +#### ###### #### ## #### ############ +#################### #### ## #### +#### ## #### ## ## ## ###### +#### ########## ###### ## ## ## #### +#### ## ## ## ## ## #### ## ## ###### +#### ## ## ## #### ###### ## ######## +#### ## ## ## ## ## ## ## ######## +#### ########## ## ## ######## ## ######## +#### ## ## ## ## ## ###### +################################################## +################################################## diff --git a/spec/expected_output/print_qr_invert_true.txt b/spec/expected_output/print_qr_invert_true.txt new file mode 100644 index 0000000..7228087 --- /dev/null +++ b/spec/expected_output/print_qr_invert_true.txt @@ -0,0 +1,25 @@ +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          +                          diff --git a/spec/expected_output/print_qr_padding_0.txt b/spec/expected_output/print_qr_padding_0.txt new file mode 100644 index 0000000..d0bd7bd --- /dev/null +++ b/spec/expected_output/print_qr_padding_0.txt @@ -0,0 +1,21 @@ +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      +                      diff --git a/spec/expected_output/print_qr_padding_3.txt b/spec/expected_output/print_qr_padding_3.txt new file mode 100644 index 0000000..cb016de --- /dev/null +++ b/spec/expected_output/print_qr_padding_3.txt @@ -0,0 +1,27 @@ +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            +                            diff --git a/spec/expected_output/print_qr_utf8.txt b/spec/expected_output/print_qr_utf8.txt new file mode 100644 index 0000000..2abf0be --- /dev/null +++ b/spec/expected_output/print_qr_utf8.txt @@ -0,0 +1,25 @@ +██████████████████████████████████████████████████ +██████████████████████████████████████████████████ +████ ████ ████ ██ ████ +████ ██████████ ██ ████ ████ ██████████ ████ +████ ██ ██ ████ ████████ ██ ██ ████ +████ ██ ██ ██ ████ ████ ██ ██ ████ +████ ██ ██ ██████ ██ ██ ██ ████ +████ ██████████ ██ ██ ██ ██████████ ████ +████ ██ ██ ██ ██ ████ +████████████████████████ ████████████████████ +████ ██ ████ ██ ██ ██ ██████ +████████ ██████████ ████ ████ ████ ██ ████ +████ ████████ ██████ ██ ████ ████ ██████ +████ ████████ ██████████ ██████ +████ ██████ ████ ██ ████ ████████████ +████████████████████ ████ ██ ████ +████ ██ ████ ██ ██ ██ ██████ +████ ██████████ ██████ ██ ██ ██ ████ +████ ██ ██ ██ ██ ██ ████ ██ ██ ██████ +████ ██ ██ ██ ████ ██████ ██ ████████ +████ ██ ██ ██ ██ ██ ██ ██ ████████ +████ ██████████ ██ ██ ████████ ██ ████████ +████ ██ ██ ██ ██ ██ ██████ +██████████████████████████████████████████████████ +██████████████████████████████████████████████████ diff --git a/spec/print_qr_spec.lua b/spec/print_qr_spec.lua new file mode 100644 index 0000000..d62c70f --- /dev/null +++ b/spec/print_qr_spec.lua @@ -0,0 +1,116 @@ +-- spec/encode_string_spec.lua +-- Specifies tests for qrprinter.encode_string functionality + +-------------------------------------------------------------------------------- +-- Disable LuaJIT compiler + +-- LuaJIT's optimizations can frob luacov's coverage reports +require( 'jit' ).off() + +-------------------------------------------------------------------------------- +-- Module imports + +qrprinter = require( 'qrprinter' ) + +-------------------------------------------------------------------------------- +-- Helper functions + +local function read_file_into_string( path ) + + -- Open file at `path` + local file = io.open( path, 'r' ) + if not file then + error( 'Error opening file at ' .. path .. ' during test.' ) + end + + -- Read file contents + local content = file:read( '*a' ) + + -- Remove terminating newline + local last_char = string.sub( content, -1 ) + if last_char == '\n' then + content = string.sub( content, 1, -2 ) + end + + file:close() + return content + +end + +-------------------------------------------------------------------------------- +-- Test context + +describe( 'qrprinter.print_qr functionality', function () + + ---------------------------------------- + -- Test-wide values + + local test_qr = qrprinter.encode_string( 'abc123' ) + + + ---------------------------------------- + -- Replace print with mock function that returns the provided string + + setup( function() + + _G.print = function( msg ) + return msg + end + + end ) + + + ---------------------------------------- + -- Test definitions + + it( 'aliases print_qr to print_qr_ansi', function() + + assert.are.same( qrprinter.print_qr( test_qr ), qrprinter.print_qr_ansi( test_qr ) ) + + end ) + + it( 'prints QR codes using ASCII characters', function() + + local expected_output = read_file_into_string( 'spec/expected_output/print_qr_ascii.txt' ) + + assert.are.same( expected_output, qrprinter.print_qr_ascii( test_qr ) ) + + end ) + + it( 'prints QR codes using ANSI escape sequences', function() + + local expected_output = read_file_into_string( 'spec/expected_output/print_qr_ansi.txt' ) + + assert.are.same( expected_output, qrprinter.print_qr_ansi( test_qr ) ) + + end ) + + it( 'prints QR codes using UTF8 block sequences', function() + + local expected_output = read_file_into_string( 'spec/expected_output/print_qr_utf8.txt' ) + + assert.are.same( expected_output, qrprinter.print_qr_utf8( test_qr ) ) + + end ) + + it( 'adjusts padding of the output when the "padding" option is provided', function() + + local padding_0_expected_output = read_file_into_string( 'spec/expected_output/print_qr_padding_0.txt' ) + + local padding_3_expected_output = read_file_into_string( 'spec/expected_output/print_qr_padding_3.txt' ) + + assert.are.same( padding_0_expected_output, qrprinter.print_qr( test_qr, { padding = 0 } ) ) + + assert.are.same( padding_3_expected_output, qrprinter.print_qr( test_qr, { padding = 3 } ) ) + + end ) + + it( 'inverts the colors of the output when the "invert" option is set', function() + + local expected_output = read_file_into_string( 'spec/expected_output/print_qr_invert_true.txt' ) + + assert.are.same( expected_output, qrprinter.print_qr( test_qr, { invert = true } ) ) + + end ) + +end )