#!/usr/bin/env ruby # frozen_string_literal: true require 'json' require 'open3' EXE = File.expand_path('exe/referator', __dir__).freeze RAW_REFS = { self: { foo: { 'kind' => 'self', 'id' => '/blog/foo', 'slug' => 'blog-foo', 'text' => 'Foo', }.freeze, bar: { 'kind' => 'self', 'id' => '/blog/bar', 'slug' => 'blog-bar', 'text' => 'Bar', }.freeze, }.freeze, link: { example_com: { 'kind' => 'link', 'id' => 'example_com', 'slug' => 'example-com', 'url' => 'https://example.com', 'text' => 'Example Domain', }.freeze, causa_arcana_com: { 'kind' => 'link', 'id' => 'causa_arcana_com', 'slug' => 'causa-arcana-com', 'url' => 'https://causa-arcana.com', 'text' => 'Causa Arcana', }.freeze, }.freeze, }.freeze REFS = { self: { foo: RAW_REFS[:self][:foo].merge( 'anchor' => 'self-blog-foo', 'fragment' => '#self-blog-foo', ).freeze, bar: RAW_REFS[:self][:bar].merge( 'anchor' => 'self-blog-bar', 'fragment' => '#self-blog-bar', ).freeze, }.freeze, link: { example_com: RAW_REFS[:link][:example_com].merge( 'anchor' => 'link-example-com', 'fragment' => '#link-example-com', ).freeze, causa_arcana_com: RAW_REFS[:link][:causa_arcana_com].merge( 'anchor' => 'link-causa-arcana-com', 'fragment' => '#link-causa-arcana-com', ).freeze, }.freeze, }.freeze @stdin, @stdout, @wait_thr = Open3.popen2 EXE, chdir: __dir__ @stdin.sync = true @stdout.sync = true at_exit do @stdin.close @stdout.close raise 'Script error' unless @wait_thr.value.success? end def cmd(name, data) @stdin.puts "#{name} #{data.to_json}" result = @stdout.gets.chomp if result.start_with? 'OK ' JSON.parse(result[3..]).freeze elsif result.start_with? 'ERR ' raise "Error response: #{result[4..]}" else raise 'Invalid response' end end ################# # REGISTER_KIND # ################# cmd :REGISTER_KIND, :self cmd :REGISTER_KIND, :link ################### # REGISTER_FORMAT # ################### cmd :REGISTER_FORMAT, { name: :html, stdin: { notes: nil }, args: ['test/render.rb', { template: nil }, { format: nil }] } cmd :REGISTER_FORMAT, { name: :json, stdin: { notes: nil }, args: ['test/render.rb', { template: nil }, { format: nil }] } ################ # REGISTER_REF # ################ cmd :REGISTER_REF, RAW_REFS[:self][:foo] cmd :REGISTER_REF, RAW_REFS[:self][:bar] cmd :REGISTER_REF, RAW_REFS[:link][:example_com] cmd :REGISTER_REF, RAW_REFS[:link][:causa_arcana_com] ####### # REF # ####### cmd(:REF, { kind: :self, id: '/blog/foo' }).tap do |result| raise unless result == REFS[:self][:foo] end cmd(:REF, { kind: :self, id: '/blog/bar' }).tap do |result| raise unless result == REFS[:self][:bar] end cmd(:REF, { kind: :link, id: :example_com }).tap do |result| raise unless result == REFS[:link][:example_com] end cmd(:REF, { kind: :link, id: :causa_arcana_com }).tap do |result| raise unless result == REFS[:link][:causa_arcana_com] end ############ # ADD_NOTE # ############ cmd(:ADD_NOTE, { kind: :self, id: '/blog/foo' }).tap do |result| raise unless result == REFS[:self][:foo].merge('index' => 1) end cmd(:ADD_NOTE, { kind: :link, id: :example_com }).tap do |result| raise unless result == REFS[:link][:example_com].merge('index' => 2) end cmd(:ADD_NOTE, { kind: :self, id: '/blog/bar' }).tap do |result| raise unless result == REFS[:self][:bar].merge('index' => 3) end cmd(:ADD_NOTE, { kind: :link, id: :causa_arcana_com }).tap do |result| raise unless result == REFS[:link][:causa_arcana_com].merge('index' => 4) end #################### # RENDER_FOOTNOTES # #################### cmd(:RENDER_FOOTNOTES, :html).tap do |result| expected = <<~HTML