339 lines
7.8 KiB
Ruby
Executable file
339 lines
7.8 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
# frozen_string_literal: true
|
|
|
|
require 'json'
|
|
require 'open3'
|
|
|
|
EXE = File.expand_path('exe/referator', __dir__).freeze
|
|
|
|
RAW_REFS = {
|
|
self: {
|
|
foo: {
|
|
'category' => 'self',
|
|
'id' => '/blog/foo',
|
|
'slug' => 'blog-foo',
|
|
'text' => 'Foo',
|
|
}.freeze,
|
|
bar: {
|
|
'category' => 'self',
|
|
'id' => '/blog/bar',
|
|
'slug' => 'blog-bar',
|
|
'text' => 'Bar',
|
|
}.freeze,
|
|
}.freeze,
|
|
link: {
|
|
example_com: {
|
|
'category' => 'link',
|
|
'id' => 'example_com',
|
|
'slug' => 'example-com',
|
|
'url' => 'https://example.com',
|
|
'text' => 'Example Domain',
|
|
}.freeze,
|
|
causa_arcana_com: {
|
|
'category' => '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
|
|
|
|
workdir = File.expand_path('test', __dir__).freeze
|
|
|
|
@stdin, @stdout, @wait_thr = Open3.popen2 EXE, workdir, 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 = nil)
|
|
@stdin.puts "#{name} #{data.to_json}"
|
|
result = @stdout.gets.chomp
|
|
if result.start_with? 'OK '
|
|
result = JSON.parse(result[3..]).freeze
|
|
yield result if block_given?
|
|
result
|
|
elsif result.start_with? 'ERR '
|
|
raise "Error response: #{result[4..]}"
|
|
else
|
|
raise 'Invalid response'
|
|
end
|
|
end
|
|
|
|
########
|
|
# NULL #
|
|
########
|
|
|
|
cmd('') { |result| raise unless result.nil? }
|
|
cmd(:NULL) { |result| raise unless result.nil? }
|
|
|
|
###################
|
|
# REGISTER_SCRIPT #
|
|
###################
|
|
|
|
cmd :REGISTER_SCRIPT,
|
|
{ name: :render,
|
|
vars: %i[template format notes note],
|
|
args: ['./render.rb',
|
|
{ template: nil },
|
|
{ format: nil }],
|
|
stdin: ['{',
|
|
'"notes":',
|
|
{ notes: nil },
|
|
',',
|
|
'"note":',
|
|
{ note: nil },
|
|
'}'] }
|
|
|
|
#####################
|
|
# REGISTER_CATEGORY #
|
|
#####################
|
|
|
|
cmd :REGISTER_CATEGORY, :self
|
|
cmd :REGISTER_CATEGORY, :link
|
|
|
|
###################
|
|
# REGISTER_FORMAT #
|
|
###################
|
|
|
|
cmd :REGISTER_FORMAT, { name: :html, script: :render }
|
|
cmd :REGISTER_FORMAT, { name: :json, script: :render }
|
|
|
|
################
|
|
# 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, { category: :self, id: '/blog/foo' } do |result|
|
|
raise unless result == REFS[:self][:foo]
|
|
end
|
|
|
|
cmd :REF, { category: :self, id: '/blog/bar' } do |result|
|
|
raise unless result == REFS[:self][:bar]
|
|
end
|
|
|
|
cmd :REF, { category: :link, id: :example_com } do |result|
|
|
raise unless result == REFS[:link][:example_com]
|
|
end
|
|
|
|
cmd :REF, { category: :link, id: :causa_arcana_com } do |result|
|
|
raise unless result == REFS[:link][:causa_arcana_com]
|
|
end
|
|
|
|
############
|
|
# MAKE_REF #
|
|
############
|
|
|
|
cmd :MAKE_REF, { category: :self, id: '/blog/foo' } do |result|
|
|
raise unless result == REFS[:self][:foo]
|
|
end
|
|
|
|
cmd :MAKE_REF, { category: :link, id: :example_com } do |result|
|
|
raise unless result == REFS[:link][:example_com]
|
|
end
|
|
|
|
cmd :MAKE_REF, { category: :self, id: '/blog/bar' } do |result|
|
|
raise unless result == REFS[:self][:bar]
|
|
end
|
|
|
|
cmd :MAKE_REF, { category: :link, id: :causa_arcana_com } do |result|
|
|
raise unless result == REFS[:link][:causa_arcana_com]
|
|
end
|
|
|
|
###################
|
|
# FETCH_FOOTNOTES #
|
|
###################
|
|
|
|
cmd :FETCH_FOOTNOTES do |result|
|
|
raise unless result == {
|
|
'self' => [
|
|
REFS[:self][:foo].merge('index' => 1),
|
|
REFS[:self][:bar].merge('index' => 2),
|
|
],
|
|
'link' => [
|
|
REFS[:link][:example_com].merge('index' => 3),
|
|
REFS[:link][:causa_arcana_com].merge('index' => 4),
|
|
],
|
|
}
|
|
end
|
|
|
|
##############
|
|
# FETCH_NOTE #
|
|
##############
|
|
|
|
cmd :FETCH_NOTE, { category: :self, id: '/blog/foo' } do |result|
|
|
raise unless result == REFS[:self][:foo].merge('index' => 1)
|
|
end
|
|
|
|
cmd :FETCH_NOTE, { category: :self, id: '/blog/bar' } do |result|
|
|
raise unless result == REFS[:self][:bar].merge('index' => 2)
|
|
end
|
|
|
|
cmd :FETCH_NOTE, { category: :link, id: :example_com } do |result|
|
|
raise unless result == REFS[:link][:example_com].merge('index' => 3)
|
|
end
|
|
|
|
cmd :FETCH_NOTE, { category: :link, id: :causa_arcana_com } do |result|
|
|
raise unless result == REFS[:link][:causa_arcana_com].merge('index' => 4)
|
|
end
|
|
|
|
####################
|
|
# RENDER_FOOTNOTES #
|
|
####################
|
|
|
|
cmd :RENDER_FOOTNOTES, :html do |result|
|
|
expected = <<~HTML
|
|
<h2>Self references</h2>
|
|
|
|
<ol>
|
|
<li id="self-blog-foo" value="1">
|
|
<a href="/blog/foo.html">Foo</a>
|
|
</li>
|
|
<li id="self-blog-bar" value="2">
|
|
<a href="/blog/bar.html">Bar</a>
|
|
</li>
|
|
</ol>
|
|
|
|
<h2>Link references</h2>
|
|
|
|
<ol>
|
|
<li id="link-example-com" value="3">
|
|
<a href="https://example.com">Example Domain</a>
|
|
</li>
|
|
<li id="link-causa-arcana-com" value="4">
|
|
<a href="https://causa-arcana.com">Causa Arcana</a>
|
|
</li>
|
|
</ol>
|
|
HTML
|
|
|
|
raise unless result == expected
|
|
end
|
|
|
|
cmd :RENDER_FOOTNOTES, :json do |result|
|
|
expected = <<~JSON
|
|
{
|
|
"self": [
|
|
{
|
|
"index": 1,
|
|
"category": "self",
|
|
"id": "/blog/foo",
|
|
"slug": "blog-foo",
|
|
"anchor": "self-blog-foo",
|
|
"fragment": "#self-blog-foo",
|
|
"url": "/blog/foo.html",
|
|
"text": "Foo"
|
|
},
|
|
{
|
|
"index": 2,
|
|
"category": "self",
|
|
"id": "/blog/bar",
|
|
"slug": "blog-bar",
|
|
"anchor": "self-blog-bar",
|
|
"fragment": "#self-blog-bar",
|
|
"url": "/blog/bar.html",
|
|
"text": "Bar"
|
|
}
|
|
],
|
|
"link": [
|
|
{
|
|
"index": 3,
|
|
"category": "link",
|
|
"id": "example_com",
|
|
"slug": "example-com",
|
|
"anchor": "link-example-com",
|
|
"fragment": "#link-example-com",
|
|
"url": "https://example.com",
|
|
"text": "Example Domain"
|
|
},
|
|
{
|
|
"index": 4,
|
|
"category": "link",
|
|
"id": "causa_arcana_com",
|
|
"slug": "causa-arcana-com",
|
|
"anchor": "link-causa-arcana-com",
|
|
"fragment": "#link-causa-arcana-com",
|
|
"url": "https://causa-arcana.com",
|
|
"text": "Causa Arcana"
|
|
}
|
|
]
|
|
}
|
|
JSON
|
|
|
|
raise unless result == expected
|
|
end
|
|
|
|
###################
|
|
# RENDER_CITE_SUP #
|
|
###################
|
|
|
|
cmd(
|
|
:RENDER_CITE_SUP,
|
|
{ format: :html, category: :self, id: '/blog/foo' },
|
|
) do |result|
|
|
raise unless result == "<sup><a href=\"#self-blog-foo\">[1]</a></sup>\n"
|
|
end
|
|
|
|
cmd(
|
|
:RENDER_CITE_SUP,
|
|
{ format: :html, category: :self, id: '/blog/bar' },
|
|
) do |result|
|
|
raise unless result == "<sup><a href=\"#self-blog-bar\">[2]</a></sup>\n"
|
|
end
|
|
|
|
cmd(
|
|
:RENDER_CITE_SUP,
|
|
{ format: :html, category: :link, id: :example_com },
|
|
) do |result|
|
|
raise unless result == "<sup><a href=\"#link-example-com\">[3]</a></sup>\n"
|
|
end
|
|
|
|
cmd(
|
|
:RENDER_CITE_SUP,
|
|
{ format: :html, category: :link, id: :causa_arcana_com },
|
|
) do |result|
|
|
raise unless result ==
|
|
"<sup><a href=\"#link-causa-arcana-com\">[4]</a></sup>\n"
|
|
end
|
|
|
|
########
|
|
# EXIT #
|
|
########
|
|
|
|
cmd(:EXIT) { |result| raise unless result.nil? }
|