# frozen_string_literal: true
require 'minitest/autorun'
require 'tmpdir'
require 'fileutils'
require 'open3'
require_relative 'check'

class EvidenceTest < Minitest::Test
  def test_archive_and_article_are_consistent
    assert Evidence.check(__dir__)
  end

  def with_copy
    Dir.mktmpdir do |dir|
      FileUtils.cp_r(__dir__, "#{dir}/bundle")
      %w[inference-roadmap-bench.jsonl inference-roadmap.html].each do |file|
        FileUtils.cp("#{__dir__}/../#{file}", dir)
      end
      yield "#{dir}/bundle"
    end
  end

  def test_changed_original_script_is_rejected
    with_copy do |dir|
      File.open("#{dir}/llama_server.rb", 'a') { |f| f.puts '# changed' }
      assert_raises(RuntimeError) { Evidence.check(dir) }
    end
  end

  def test_missing_row_is_rejected
    rows = Evidence.rows(__dir__)
    rows.pop
    assert_raises(RuntimeError) { Evidence.check_rows(rows) }
  end

  def test_incorrect_aggregate_is_rejected
    rows = Evidence.rows(__dir__)
    rows[8]['aggregate_tps'] = 80.7
    assert_raises(RuntimeError) { Evidence.check_rows(rows) }
  end

  def test_incorrect_token_count_is_rejected
    rows = Evidence.rows(__dir__)
    rows[8]['total_gen_tokens'] = 200
    assert_raises(RuntimeError) { Evidence.check_rows(rows) }
  end

  def test_mixed_workload_table_is_rejected
    with_copy do |dir|
      path = "#{dir}/../inference-roadmap.html"
      File.write(path, File.read(path).sub('>30.3</td>', '>30.8</td>'))
      assert_raises(RuntimeError) { Evidence.check(dir) }
    end
  end

  def test_original_scripts_against_offline_http_fixture
    %w[llama_server ollama].each do |name|
      out, err, status = Open3.capture3({'SLOTS' => '4'}, RbConfig.ruby,
        '-r', "#{__dir__}/fixture.rb", "#{__dir__}/#{name}.rb", '4')
      assert status.success?, err
      result = JSON.parse(out)
      assert_equal 4, result.fetch('concurrency')
      assert_equal 800, result.fetch('total_gen_tokens')
      assert_equal [20.0] * 4, result.fetch('per_req_decode_tps')
      assert_equal 20.0, result.fetch('aggregate_tps')
      assert_equal 40.0, result.fetch('wall_s')
      assert_equal 10.0, result.fetch('max_latency_s')
    end
  end
end
