-- Copyright (C) 2018  David Capello
--
-- This file is released under the terms of the MIT license.
-- Read LICENSE.txt for more information.

-- Isolated selection
do
  local a = Selection()
  assert(a.bounds.x == 0)
  assert(a.bounds.y == 0)
  assert(a.bounds.width == 0)
  assert(a.bounds.height == 0)
  assert(a.isEmpty)

  a:select(1, 2, 3, 4)
  assert(a.bounds.x == 1)
  assert(a.bounds.y == 2)
  assert(a.bounds.width == 3)
  assert(a.bounds.height == 4)
  assert(not a.isEmpty)
  assert(a:contains(1, 2))
  assert(a:contains(1+3-1, 2+4-1))
  assert(not a:contains(0, 1))
  assert(not a:contains(1+3, 2+4))

  a:select{x=5, y=6, width=7, height=8}
  assert(a.bounds.x == 5)
  assert(a.bounds.y == 6)
  assert(a.bounds.width == 7)
  assert(a.bounds.height == 8)

  a:deselect()
  assert(a.bounds.x == 0)
  assert(a.bounds.y == 0)
  assert(a.bounds.width == 0)
  assert(a.bounds.height == 0)
  assert(a.isEmpty)
  assert(not a:contains(0, 0))

  -- Constructor with rectangles
  local b = Selection(1, 2, 3, 4)
  assert(b.bounds == Rectangle(1, 2, 3, 4))
  assert(b.origin == Point(1, 2))

  -- Move
  b.origin = Point(5, 6)
  assert(b.bounds == Rectangle(5, 6, 3, 4))
  assert(b.origin == Point(5, 6))
end

-- Sprite Selection
do
  local spr = Sprite(32, 32)
  local sel = spr.selection
  assert(sel.bounds.x == 0)
  assert(sel.bounds.y == 0)
  assert(sel.bounds.width == 0)
  assert(sel.bounds.height == 0)

  sel:selectAll()
  assert(sel.bounds.x == 0)
  assert(sel.bounds.y == 0)
  assert(sel.bounds.width == spr.width)
  assert(sel.bounds.height == spr.height)

  sel:select(2, 3, 4, 5)
  assert(sel.bounds.x == 2)
  assert(sel.bounds.y == 3)
  assert(sel.bounds.width == 4)
  assert(sel.bounds.height == 5)

  sel.origin = Point(5, 6)
  assert(sel.bounds == Rectangle(5, 6, 4, 5))
end

-- Comparison
do
  local a = Selection()
  local b = Selection()
  assert(a == b)

  a:select(0, 0, 1, 1)
  assert(a ~= b)

  b:add(a)
  assert(a == b)

  a:subtract(b)
  assert(a ~= b)

  b:subtract(b)
  assert(a == b)
end

-- Operations
do
  local a = Selection()
  a:select(2, 3, 4, 5)
  assert(a.bounds == Rectangle(2, 3, 4, 5))

  a:subtract(2, 3, 4, 1)
  assert(a.bounds == Rectangle(2, 4, 4, 4))

  assert(a:contains(3, 5))
  a:subtract(3, 5, 1, 1)
  assert(not a:contains(3, 5))
  assert(a.bounds == Rectangle(2, 4, 4, 4))

  local b = Selection()
  assert(a.bounds == Rectangle(2, 4, 4, 4))
  assert(b.isEmpty)
  a:subtract(b) -- This should be a no-op because b is empty
  assert(a.bounds == Rectangle(2, 4, 4, 4))

  b:select(0, 0, 32, 32)
  assert(a ~= b)
  b:intersect(a)
  assert(a == b)
  assert(b.bounds == Rectangle(2, 4, 4, 4))
  assert(b.bounds == Rectangle(2, 4, 4, 4))
end