require "test_helper"

class Measured::LengthTest < ActiveSupport::TestCase
  test ".unit_names_with_aliases should be the expected list of valid units" do
    assert_equal(
      %w(
        centimeter centimeters centimetre centimetres cm feet foot ft
        in inch inches m meter meters metre metres millimeter
        millimeters millimetre millimetres mm yard yards yd
      ),
      Measured::Length.unit_names_with_aliases
    )
  end

  test ".unit_names should be the list of base unit names" do
    assert_equal %w(cm ft in m mm yd), Measured::Length.unit_names
  end

  test ".name" do
    assert_equal "length", Measured::Length.name
  end

  test "Measured::Length() delegates automatically to .new" do
    assert_equal Measured::Length.new(1, :in), Measured::Length(1, :in)
    assert_equal Measured::Length.new(200, :mm), Measured::Length(20, :cm)
  end

  test ".convert_to from cm to cm" do
    assert_exact_conversion Measured::Length, "2000 cm", "2000 cm"
  end

  test ".convert_to from cm to ft" do
    assert_conversion Measured::Length, "2000 cm", "0.656167979E2 ft"
  end

  test ".convert_to from cm to in" do
    assert_conversion Measured::Length, "2000 cm", "0.7874015748E3 in"
  end

  test ".convert_to from cm to m" do
    assert_exact_conversion Measured::Length, "2000 cm", "20 m"
  end

  test ".convert_to from cm to mm" do
    assert_exact_conversion Measured::Length, "2000 cm", "20000 mm"
  end

  test ".convert_to from cm to yd" do
    assert_conversion Measured::Length, "2000 cm", "0.2187226596E2 yd"
  end

  test ".convert_to from ft to cm" do
    assert_conversion Measured::Length, "2000 ft", "60960 cm"
  end

  test ".convert_to from ft to ft" do
    assert_exact_conversion Measured::Length, "2000 ft", "2000 ft"
  end

  test ".convert_to from ft to in" do
    assert_exact_conversion Measured::Length, "2000 ft", "24000 in"
  end

  test ".convert_to from ft to m" do
    assert_exact_conversion Measured::Length, "2000 ft", "609.6 m"
  end

  test ".convert_to from ft to mm" do
    assert_conversion Measured::Length, "2000 ft", "609600 mm"
  end

  test ".convert_to from ft to yd" do
    assert_conversion Measured::Length, "2000 ft", "0.666666667E3 yd"
  end

  test ".convert_to from in to cm" do
    assert_conversion Measured::Length, "2000 in", "5080 cm"
  end

  test ".convert_to from in to ft" do
    assert_conversion Measured::Length, "2000 in", "0.166666666666E3 ft"
  end

  test ".convert_to from in to in" do
    assert_exact_conversion Measured::Length, "2000 in", "2000 in"
  end

  test ".convert_to from in to m" do
    assert_conversion Measured::Length, "2000 in", "50.8 m"
  end

  test ".convert_to from in to mm" do
    assert_conversion Measured::Length, "2000 in", "50800 mm"
  end

  test ".convert_to from in to yd" do
    assert_conversion Measured::Length, "2000 in", "0.555555555384E2 yd"
  end

  test ".convert_to from m to cm" do
    assert_conversion Measured::Length, "2000 m", "200000 cm"
  end

  test ".convert_to from m to ft" do
    assert_conversion Measured::Length, "2000 m", "0.656167979E4 ft"
  end

  test ".convert_to from m to in" do
    assert_conversion Measured::Length, "2000 m", "0.7874015748E5 in"
  end

  test ".convert_to from m to m" do
    assert_exact_conversion Measured::Length, "2000 m", "2000 m"
  end

  test ".convert_to from m to mm" do
    assert_exact_conversion Measured::Length, "2000 m", "2000000 mm"
  end

  test ".convert_to from m to yd" do
    assert_conversion Measured::Length, "2000 m", "0.2187226596E4 yd"
  end

  test ".convert_to from mm to cm" do
    assert_exact_conversion Measured::Length, "2000 mm", "200 cm"
  end

  test ".convert_to from mm to ft" do
    assert_conversion Measured::Length, "2000 mm", "0.656167979E1 ft"
  end

  test ".convert_to from mm to in" do
    assert_conversion Measured::Length, "2000 mm", "0.7874015748E2 in"
  end

  test ".convert_to from mm to m" do
    assert_exact_conversion Measured::Length, "2000 mm", "2 m"
  end

  test ".convert_to from mm to mm" do
    assert_exact_conversion Measured::Length, "2000 mm", "2000 mm"
  end

  test ".convert_to from mm to yd" do
    assert_conversion Measured::Length, "2000 mm", "0.2187226596E1 yd"
  end

  test ".convert_to from yd to cm" do
    assert_conversion Measured::Length, "2000 yd", "0.18288E6 cm"
  end

  test ".convert_to from yd to ft" do
    assert_exact_conversion Measured::Length, "2000 yd", "6000 ft"
  end

  test ".convert_to from yd to in" do
    assert_exact_conversion Measured::Length, "2000 yd", "72000 in"
  end

  test ".convert_to from yd to m" do
    assert_conversion Measured::Length, "2000 yd", "1828.8 m"
  end

  test ".convert_to from yd to mm" do
    assert_conversion Measured::Length, "2000 yd", "1828800 mm"
  end

  test ".convert_to from yd to yd" do
    assert_exact_conversion Measured::Length, "2000 yd", "2000 yd"
  end

end