From 2d805379f974007609f589d96145415b7235825e Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Mon, 7 Oct 2019 15:54:00 +0900 Subject: [PATCH] Add test for generated image --- .dockerignore | 1 + .travis.yml | 34 ++++++++++++++------ charty.gemspec | 13 ++++---- dockerfiles/Dockerfile.ruby-2.6 | 41 +++++++++++++++++++++++++ test/backends/pyplot/curve_integer.png | Bin 0 -> 21993 bytes test/backends/pyplot/curve_test.rb | 23 ++++++++++++++ test/test_helper.rb | 21 +++++++++++++ 7 files changed, 117 insertions(+), 16 deletions(-) create mode 100644 .dockerignore create mode 100644 dockerfiles/Dockerfile.ruby-2.6 create mode 100644 test/backends/pyplot/curve_integer.png create mode 100644 test/backends/pyplot/curve_test.rb diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..07e8e4a2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +/dockerfiles/ diff --git a/.travis.yml b/.travis.yml index 18547fec..1aa4598e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,24 @@ ---- -dist: xenial -language: ruby -cache: bundler -rvm: - - 2.6 -env: - - PYENV_VERSION=3.7 PYTHON=python -before_install: - - pip install --user matplotlib +notifications: + webhooks: + - https://webhook.commit-email.info/ + +services: + - docker + +matrix: + include: + - name: Ruby 2.6 + env: TYPE=ruby-2.6 + +install: + - docker build + -t red-data-tools/charty-${TYPE} + -f dockerfiles/Dockerfile.${TYPE} + . + +script: + - docker run + --interactive + --tty + red-data-tools/charty-${TYPE} + bundle exec rake diff --git a/charty.gemspec b/charty.gemspec index 7333de46..d7613690 100644 --- a/charty.gemspec +++ b/charty.gemspec @@ -26,14 +26,15 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] + spec.add_development_dependency "activerecord" spec.add_development_dependency "bundler", ">= 1.16" - spec.add_development_dependency "rake" - spec.add_development_dependency "test-unit" - spec.add_development_dependency "numo-narray" + spec.add_development_dependency "daru" + spec.add_development_dependency "matplotlib" spec.add_development_dependency "nmatrix" + spec.add_development_dependency "numo-narray" + spec.add_development_dependency "rake" spec.add_development_dependency "red-datasets", ">= 0.0.9" - spec.add_development_dependency "daru" - spec.add_development_dependency "activerecord" + spec.add_development_dependency "red-opencv" spec.add_development_dependency "sqlite3" - spec.add_development_dependency "matplotlib" + spec.add_development_dependency "test-unit" end diff --git a/dockerfiles/Dockerfile.ruby-2.6 b/dockerfiles/Dockerfile.ruby-2.6 new file mode 100644 index 00000000..9e1eeab1 --- /dev/null +++ b/dockerfiles/Dockerfile.ruby-2.6 @@ -0,0 +1,41 @@ +FROM ruby:2.6 + +RUN \ + apt update && \ + apt install -y \ + apt-transport-https \ + wget && \ + wget -O /usr/share/keyrings/red-data-tools-keyring.gpg \ + https://packages.red-data-tools.org/debian/red-data-tools-keyring.gpg && \ + echo "deb [signed-by=/usr/share/keyrings/red-data-tools-keyring.gpg] https://packages.red-data-tools.org/debian/ buster main" > \ + /etc/apt/sources.list.d/red-data-tools.list && \ + apt update && \ + apt install -y \ + python3-pip \ + sudo \ + xvfb && \ + gem install \ + bundler \ + rake && \ + pip3 install \ + matplotlib + +RUN \ + useradd --user-group --create-home charty + +RUN \ + echo "charty ALL=(ALL:ALL) NOPASSWD:ALL" | \ + EDITOR=tee visudo -f /etc/sudoers.d/charty + +COPY . /home/charty/charty +RUN chown -R charty:charty /home/charty/charty + +USER charty +WORKDIR /home/charty/charty + +RUN bundle install + +CMD \ + dbus-run-session \ + xvfb-run --server-args "-screen 0 640x480x24" \ + bundle exec rake diff --git a/test/backends/pyplot/curve_integer.png b/test/backends/pyplot/curve_integer.png new file mode 100644 index 0000000000000000000000000000000000000000..48a9baff8fa73358e5978877aa15ba291410ebd6 GIT binary patch literal 21993 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 ULK{2}wycP~?%unriHCmv3&idAP5=M^ literal 0 HcmV?d00001 diff --git a/test/backends/pyplot/curve_test.rb b/test/backends/pyplot/curve_test.rb new file mode 100644 index 00000000..5d40fc14 --- /dev/null +++ b/test/backends/pyplot/curve_test.rb @@ -0,0 +1,23 @@ +require_relative "../../test_helper" + +class BackendsPyplotCurveTest < Test::Unit::TestCase + include Helper::Image + + def setup + @plotter = Charty::Plotter.new(:pyplot) + end + + def expected_image_path(*components) + File.join(__dir__, *components) + end + + test("Integer") do + curve = @plotter.curve do + series [0, 1, 2, 3, 4], [10, 40, 20, 90, 70], label: "sample1" + end + output = Tempfile.new(["curve", ".png"]) + curve.save(output.path) + assert_image(expected_image_path("curve_integer.png"), + output.path) + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index bd9de9e6..63020348 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,24 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) require 'charty' require 'test/unit' +require 'tempfile' +begin + require 'cv' +rescue LoadError +end + + +module Helper + module Image + def assert_image(expected_path, actual_path) + unless defined?(::CV) + omit("red-opencv is required for #{__method__}") + end + expected = CV::Image.read(expected_path) + actual = CV::Image.read(actual_path) + # TODO: Make this loose + assert_equal(expected.bytes.to_s, + actual.bytes.to_s) + end + end +end