Code.require_file("test_helper.exs", __DIR__) defmodule RangeTest do use ExUnit.Case, async: true doctest Range defp reverse(first..last) do last..first end defp assert_disjoint(r1, r2) do disjoint_assertions(r1, r2, true) end defp assert_overlap(r1, r2) do disjoint_assertions(r1, r2, false) end defp disjoint_assertions(r1, r2, expected) do # The caller should choose pairs of representative ranges, and we take care # here of commuting them. Enum.each([[r1, r2], [r2, r1]], fn [a, b] -> assert Range.disjoint?(a, b) == expected assert Range.disjoint?(reverse(a), b) == expected assert Range.disjoint?(a, reverse(b)) == expected assert Range.disjoint?(reverse(a), reverse(b)) == expected end) end test "new" do assert Range.new(1, 3) == 1..3//1 assert Range.new(3, 1) == 3..1//-1 assert Range.new(1, 3, 2) == 1..3//2 assert Range.new(3, 1, -2) == 3..1//-2 end test "op" do assert (1..3).first == 1 assert (1..3).last == 3 assert (1..3).step == 1 assert (3..1).step == -1 assert (1..3//2).step == 2 end test "inspect" do assert inspect(1..3) == "1..3" assert inspect(3..1) == "3..1//-1" end test "limits are integer only" do first = 1.0 last = 3.0 message = "ranges (first..last) expect both sides to be integers, got: 1.0..3.0" assert_raise ArgumentError, message, fn -> first..last end first = [] last = [] message = "ranges (first..last) expect both sides to be integers, got: []..[]" assert_raise ArgumentError, message, fn -> first..last end end test "step is a non-zero integer" do step = 1.0 message = ~r"the step to be a non-zero integer" assert_raise ArgumentError, message, fn -> 1..3//step end step = 0 message = ~r"the step to be a non-zero integer" assert_raise ArgumentError, message, fn -> 1..3//step end end describe "disjoint?" do test "returns true for disjoint ranges" do assert_disjoint(1..5, 6..9) assert_disjoint(-3..1, 2..3) assert_disjoint(-7..-5, -3..-1) assert Range.disjoint?(1..1, 2..2) == true assert Range.disjoint?(2..2, 1..1) == true end test "returns false for ranges with common endpoints" do assert_overlap(1..5, 5..9) assert_overlap(-1..0, 0..1) assert_overlap(-7..-5, -5..-1) end test "returns false for ranges that overlap" do assert_overlap(1..5, 3..7) assert_overlap(-3..1, -1..3) assert_overlap(-7..-5, -5..-1) assert Range.disjoint?(1..1, 1..1) == false end end end