# frozen_string_literal: true

require "cases/helper"

module ActiveModel
  module Type
    class BooleanTest < ActiveModel::TestCase
      def test_type_cast_boolean
        type = Type::Boolean.new
        assert_predicate type.cast(""), :nil?
        assert_predicate type.cast(nil), :nil?

        assert type.cast(true)
        assert type.cast(1)
        assert type.cast("1")
        assert type.cast("t")
        assert type.cast("T")
        assert type.cast("true")
        assert type.cast("TRUE")
        assert type.cast("on")
        assert type.cast("ON")
        assert type.cast(" ")
        assert type.cast("\u3000\r\n")
        assert type.cast("\u0000")
        assert type.cast("SOMETHING RANDOM")
        assert type.cast(:"1")
        assert type.cast(:t)
        assert type.cast(:T)
        assert type.cast(:true)
        assert type.cast(:TRUE)
        assert type.cast(:on)
        assert type.cast(:ON)

        # explicitly check for false vs nil
        assert_equal false, type.cast(false)
        assert_equal false, type.cast(0)
        assert_equal false, type.cast("0")
        assert_equal false, type.cast("f")
        assert_equal false, type.cast("F")
        assert_equal false, type.cast("false")
        assert_equal false, type.cast("FALSE")
        assert_equal false, type.cast("off")
        assert_equal false, type.cast("OFF")
        assert_equal false, type.cast(:"0")
        assert_equal false, type.cast(:f)
        assert_equal false, type.cast(:F)
        assert_equal false, type.cast(:false)
        assert_equal false, type.cast(:FALSE)
        assert_equal false, type.cast(:off)
        assert_equal false, type.cast(:OFF)
      end
    end
  end
end
