x1 <- torch::torch_ones(5)
y1 <- torch::torch_ones(5)
x2 <- x1 + 1
y2 <- y1 + 1
boxes <- torch::torch_stack(list(x1,y1,x2,y2))$transpose(2,1)

test_that("batched_nms", {
  expect_no_error(
    x <- batched_nms(
      boxes = boxes,
      scores = torch::torch_ones(5)*0.6,
      idxs = torch::torch_ones(5),
      iou_threshold = 0.5
    )
  )
  expect_tensor(x)
  expect_equal_to_r(x, 1L)

  boxes <- torch::torch_stack(list(x1 + torch_randint(0,6,5),
                                  y1 + torch_randint(0,6,5),
                                  x2 + torch_randint(6,12,5),
                                  y2 + torch_randint(6,12,5)))$transpose(2,1)
  expect_no_error(
    x <- batched_nms(
      boxes = boxes,
      scores = torch::torch_ones(5)*0.6,
      idxs = torch::torch_ones(5),
      iou_threshold = 2
    )
  )
  expect_tensor(x)
  expect_gt(x$shape, 1L)
})

test_that("remove_small_boxes", {
  expect_no_error(x <- remove_small_boxes(boxes, 1))
  expect_tensor(x)
})

test_that("clip_boxes_to_image", {
  expect_no_error(x <- clip_boxes_to_image(boxes, c(10,10)))
  expect_tensor(x)
})

test_that("box_convert", {
  xyxy <- boxes
  xywh <- box_convert(xyxy, "xyxy", "xywh")
  cxcywh <- box_convert(xyxy, "xyxy", "cxcywh")

  expect_tensor(xywh)
  expect_tensor(cxcywh)
})

test_that("box_area", {
  area_6 <- torch::torch_tensor(matrix(c(0,0,2,3), 1, 4))
  expect_no_error(x <- box_area(area_6))
  expect_equal_to_r(x, 6)
})

test_that("box_iou", {
  expect_no_error(x <- box_iou(boxes, boxes))
  expect_tensor(x)
  expect_equal_to_r(x, matrix(1, nrow = 5, ncol = 5))

  expect_no_error(x <- generalized_box_iou(boxes, boxes))
  expect_tensor(x)
  expect_equal_to_r(x, matrix(1, nrow = 5, ncol = 5))
})

