class QsimTestHook

Attributes

examples[R]

Public Instance Methods

command_line(filename) click to toggle source
# File lib/test_hook.rb, line 11
def command_line(filename)
  "runqsim #{filename} #{q_architecture} #{input_file_separator}"
end
compile_file_content(request) click to toggle source
# File lib/test_hook.rb, line 15
def compile_file_content(request)
  test = parse_test(request)
  @examples = to_examples(test[:examples])
  @subject = test[:subject]

  Qsim::Subject
    .from_test(test, request)
    .compile_code(input_file_separator, initial_state_file)
end
execute!(request) click to toggle source
# File lib/test_hook.rb, line 25
def execute!(request)
  result, = run_file! compile request
  parse_json result
end
post_process_file(_file, result, status) click to toggle source
# File lib/test_hook.rb, line 30
def post_process_file(_file, result, status)
  output = parse_json result

  case status
    when :passed
      framework.test output, @examples
    when :failed
      [output[:error], :errored]
    else
      [output, status]
  end
end
tempfile_extension() click to toggle source
# File lib/test_hook.rb, line 7
def tempfile_extension
  '.qsim'
end

Private Instance Methods

category(key) click to toggle source
# File lib/test_hook.rb, line 63
def category(key)
  field = key.to_s
  return :records if record?(field)
  return :flags if flag?(field)
  return :memory if memory?(field)
  return :special_records if special_record?(field)
  :unknown
end
check_memory_range(config) click to toggle source
# File lib/test_hook.rb, line 120
def check_memory_range(config)
  memory_settings = config[:memory]
  from = memory_settings[:from].to_hex
  to = memory_settings[:to].to_hex
  config[:memory] = false unless to > from && in_memory_range?(from, to)
end
classify(fields) click to toggle source
# File lib/test_hook.rb, line 52
def classify(fields)
  classified_fields = {}
  fields.each do |key, value|
    kind = category(key)
    unless kind == :unknown
      classified_fields.deep_merge!(kind => { key => value })
    end
  end
  classified_fields
end
default_initial_state() click to toggle source
# File lib/test_hook.rb, line 135
def default_initial_state
  {
    special_records: {
      PC: '0000',
      SP: 'FFEF',
      IR: '0000'
    },
    flags: {
      N: 0,
      Z: 0,
      V: 0,
      C: 0
    },
    records: {
      R0: '0000',
      R1: '0000',
      R2: '0000',
      R3: '0000',
      R4: '0000',
      R5: '0000',
      R6: '0000',
      R7: '0000'
    },
    memory: {}
  }
end
define_output(parsed_tests) click to toggle source
# File lib/test_hook.rb, line 109
def define_output(parsed_tests)
  output = { records: true }
  output.merge!(parsed_tests[:output] || {})
  check_memory_range(output) if output[:memory].is_a? Hash
  output.tap do |hash|
    hash
      .delete_if { |_, value| !value }
      .slice!(:records, :flags, :special_records, :memory)
  end
end
flag?(key) click to toggle source
# File lib/test_hook.rb, line 78
def flag?(key)
  %w(N C V Z).include? key
end
framework() click to toggle source
# File lib/test_hook.rb, line 90
def framework
  Mumukit::Metatest::Framework.new checker: Qsim::Checker.new,
                                   runner: Qsim::MultipleExecutionsRunner.new
end
in_memory_range?(*addresses) click to toggle source
# File lib/test_hook.rb, line 127
def in_memory_range?(*addresses)
  addresses.all? { |address| memory_range.include?(address) }
end
initial_state_file() click to toggle source
# File lib/test_hook.rb, line 162
def initial_state_file
  initial_states = @examples.map do |example|
    default_initial_state
      .merge(id: example[:id])
      .deep_merge(example[:preconditions])
  end
  JSON.generate(initial_states)
end
input_file_separator() click to toggle source
# File lib/test_hook.rb, line 175
def input_file_separator
  '!!!BEGIN_EXAMPLES!!!'
end
load_tests(request) click to toggle source
# File lib/test_hook.rb, line 105
def load_tests(request)
  YAML.load(request.test).deep_symbolize_keys
end
memory?(key) click to toggle source
# File lib/test_hook.rb, line 82
def memory?(key)
  /^[A-F0-9]{4}/.matches?(key)
end
memory_range() click to toggle source
# File lib/test_hook.rb, line 131
def memory_range
  0..0xFFFF
end
parse_json(json_result) click to toggle source
# File lib/test_hook.rb, line 95
def parse_json(json_result)
  JSON.parse(json_result).map(&:deep_symbolize_keys)
end
parse_test(request) click to toggle source
# File lib/test_hook.rb, line 99
def parse_test(request)
  load_tests(request).tap do |tests|
    @output = define_output(tests)
  end
end
q_architecture() click to toggle source
# File lib/test_hook.rb, line 171
def q_architecture
  6
end
record?(key) click to toggle source
# File lib/test_hook.rb, line 72
def record?(key)
  (0..7)
    .map { |number| "R#{number}" }
    .include?(key)
end
special_record?(key) click to toggle source
# File lib/test_hook.rb, line 86
def special_record?(key)
  %w(SP PC IR).include? key
end
to_examples(examples) click to toggle source
# File lib/test_hook.rb, line 45
def to_examples(examples)
  examples.each_with_index.map do |example, index|
    example[:preconditions] = classify(example.fetch(:preconditions, {}))
    { id: index, output: @output }.deep_merge example
  end
end