require "test_helper"

class OldNodeTest < ActiveSupport::TestCase
  api_fixtures

  def test_node_count
    assert_equal 23, OldNode.count
  end

  def test_node_too_far_north
    invalid_node_test(:node_too_far_north)
  end

  def test_node_north_limit
    valid_node_test(:node_north_limit)
  end

  def test_node_too_far_south
    invalid_node_test(:node_too_far_south)
  end

  def test_node_south_limit
    valid_node_test(:node_south_limit)
  end

  def test_node_too_far_west
    invalid_node_test(:node_too_far_west)
  end

  def test_node_west_limit
    valid_node_test(:node_west_limit)
  end

  def test_node_too_far_east
    invalid_node_test(:node_too_far_east)
  end

  def test_node_east_limit
    valid_node_test(:node_east_limit)
  end

  def test_totally_wrong
    invalid_node_test(:node_totally_wrong)
  end

  # This helper method will check to make sure that a node is within the world, and
  # has the the same lat, lon and timestamp than what was put into the db by
  # the fixture
  def valid_node_test(nod)
    node = nodes(nod)
    dbnode = Node.find(node.node_id)
    assert_equal dbnode.lat, node.latitude.to_f / OldNode::SCALE
    assert_equal dbnode.lon, node.longitude.to_f / OldNode::SCALE
    assert_equal dbnode.changeset_id, node.changeset_id
    assert_equal dbnode.version, node.version
    assert_equal dbnode.visible, node.visible
    assert_equal dbnode.timestamp, node.timestamp
    # assert_equal node.tile, QuadTile.tile_for_point(nodes(nod).lat, nodes(nod).lon)
    assert node.valid?
  end

  # This helpermethod will check to make sure that a node is outwith the world,
  # and has the same lat, lon and timesamp than what was put into the db by the
  # fixture
  def invalid_node_test(nod)
    node = nodes(nod)
    dbnode = Node.find(node.node_id)
    assert_equal dbnode.lat, node.latitude.to_f / OldNode::SCALE
    assert_equal dbnode.lon, node.longitude.to_f / OldNode::SCALE
    assert_equal dbnode.changeset_id, node.changeset_id
    assert_equal dbnode.version, node.version
    assert_equal dbnode.visible, node.visible
    assert_equal dbnode.timestamp, node.timestamp
    # assert_equal node.tile, QuadTile.tile_for_point(nodes(nod).lat, nodes(nod).lon)
    assert_equal false, node.valid?
  end

  def test_node_tags
    taglist_v3 = create_list(:old_node_tag, 3, :old_node => nodes(:node_with_versions_v3))
    taglist_v4 = create_list(:old_node_tag, 2, :old_node => nodes(:node_with_versions_v4))

    node = nodes(:node_with_versions_v1)
    tags = OldNode.find(node.id).old_tags.order(:k)
    assert_equal 0, tags.count

    node = nodes(:node_with_versions_v2)
    tags = OldNode.find(node.id).old_tags.order(:k)
    assert_equal 0, tags.count

    node = nodes(:node_with_versions_v3)
    tags = OldNode.find(node.id).old_tags.order(:k)
    assert_equal taglist_v3.count, tags.count
    taglist_v3.sort_by!(&:k).each_index do |i|
      assert_equal taglist_v3[i].k, tags[i].k
      assert_equal taglist_v3[i].v, tags[i].v
    end

    node = nodes(:node_with_versions_v4)
    tags = OldNode.find(node.id).old_tags.order(:k)
    assert_equal taglist_v4.count, tags.count
    taglist_v4.sort_by!(&:k).each_index do |i|
      assert_equal taglist_v4[i].k, tags[i].k
      assert_equal taglist_v4[i].v, tags[i].v
    end
  end

  def test_tags
    taglist_v3 = create_list(:old_node_tag, 3, :old_node => nodes(:node_with_versions_v3))
    taglist_v4 = create_list(:old_node_tag, 2, :old_node => nodes(:node_with_versions_v4))

    node = nodes(:node_with_versions_v1)
    tags = OldNode.find(node.id).tags
    assert_equal 0, tags.size

    node = nodes(:node_with_versions_v2)
    tags = OldNode.find(node.id).tags
    assert_equal 0, tags.size

    node = nodes(:node_with_versions_v3)
    tags = OldNode.find(node.id).tags
    assert_equal taglist_v3.count, tags.count
    taglist_v3.each do |tag|
      assert_equal tag.v, tags[tag.k]
    end

    node = nodes(:node_with_versions_v4)
    tags = OldNode.find(node.id).tags
    assert_equal taglist_v4.count, tags.count
    taglist_v4.each do |tag|
      assert_equal tag.v, tags[tag.k]
    end
  end
end
