require "test_helper"

class PublicSuffix::ListTest < Minitest::Test

  def setup
    @list = PublicSuffix::List.new
  end

  def teardown
    PublicSuffix::List.default = nil
  end


  def test_initialize
    assert_instance_of PublicSuffix::List, @list
    assert_equal 0, @list.size
  end


  def test_equality_with_self
    list = PublicSuffix::List.new
    assert_equal list, list
  end

  def test_equality_with_internals
    rule = PublicSuffix::Rule.factory("com")
    assert_equal PublicSuffix::List.new.add(rule), PublicSuffix::List.new.add(rule)
  end

  def test_each_without_block
    list = PublicSuffix::List.parse(<<EOS)
alpha
beta
EOS

    assert_kind_of Enumerator, list.each
    assert_equal 2, list.each.count
    assert_equal PublicSuffix::Rule.factory("alpha"), list.each.first
  end

  def test_each_with_block
    list = PublicSuffix::List.parse(<<EOS)
alpha
beta
EOS

    entries = []
    list.each { |r| entries << r }

    assert_equal 2, entries.count
    assert_equal PublicSuffix::Rule.factory("alpha"), entries.first
  end


  def test_add
    assert_equal @list, @list.add(PublicSuffix::Rule.factory("foo"))
    assert_equal @list, @list <<  PublicSuffix::Rule.factory("bar")
    assert_equal 2, @list.size
  end

  def test_add_should_recreate_index
    @list = PublicSuffix::List.parse("com")
    assert_equal PublicSuffix::Rule.factory("com"), @list.find("google.com")
    assert_equal @list.default_rule, @list.find("google.net")

    @list << PublicSuffix::Rule.factory("net")
    assert_equal PublicSuffix::Rule.factory("com"), @list.find("google.com")
    assert_equal PublicSuffix::Rule.factory("net"), @list.find("google.net")
  end

  def test_empty?
    assert @list.empty?
    @list.add(PublicSuffix::Rule.factory(""))
    assert !@list.empty?
  end

  def test_size
    assert_equal 0, @list.size
    assert_equal @list, @list.add(PublicSuffix::Rule.factory(""))
    assert_equal 1, @list.size
  end

  def test_clear
    assert_equal 0, @list.size
    assert_equal @list, @list.add(PublicSuffix::Rule.factory(""))
    assert_equal 1, @list.size
    assert_equal @list, @list.clear
    assert_equal 0, @list.size
  end


  def test_find
    list = PublicSuffix::List.parse(<<EOS)
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

// ===BEGIN ICANN DOMAINS===

// com
com

// uk
*.uk
*.sch.uk
!bl.uk
!british-library.uk

// io
io

// ===END ICANN DOMAINS===
// ===BEGIN PRIVATE DOMAINS===

// Google, Inc.
blogspot.com

// ===END PRIVATE DOMAINS===
EOS

    # match IANA
    assert_equal PublicSuffix::Rule.factory("com"), list.find("example.com")
    assert_equal PublicSuffix::Rule.factory("com"), list.find("foo.example.com")

    # match wildcard
    assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("example.uk")
    assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("example.co.uk")
    assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("foo.example.co.uk")

    # match exception
    assert_equal PublicSuffix::Rule.factory("!british-library.uk"), list.find("british-library.uk")
    assert_equal PublicSuffix::Rule.factory("!british-library.uk"), list.find("foo.british-library.uk")

    # match default rule
    assert_equal PublicSuffix::Rule.factory("*"), list.find("test")
    assert_equal PublicSuffix::Rule.factory("*"), list.find("example.test")
    assert_equal PublicSuffix::Rule.factory("*"), list.find("foo.example.test")

    # match private
    assert_equal PublicSuffix::Rule.factory("blogspot.com", private: true), list.find("blogspot.com")
    assert_equal PublicSuffix::Rule.factory("blogspot.com", private: true), list.find("foo.blogspot.com")
  end


  def test_select
    assert_equal 2, list.send(:select, "british-library.uk").size
  end

  def test_select_name_blank
    assert_equal [], list.send(:select, nil)
    assert_equal [], list.send(:select, "")
    assert_equal [], list.send(:select, " ")
  end

  def test_select_ignore_private
    list = PublicSuffix::List.new
    list.add r1 = PublicSuffix::Rule.factory("io")
    list.add r2 = PublicSuffix::Rule.factory("example.io", private: true)

    assert_equal list.send(:select, "foo.io"), [r1]
    assert_equal list.send(:select, "example.io"), [r1, r2]
    assert_equal list.send(:select, "foo.example.io"), [r1, r2]

    assert_equal list.send(:select, "foo.io", ignore_private: false), [r1]
    assert_equal list.send(:select, "example.io", ignore_private: false), [r1, r2]
    assert_equal list.send(:select, "foo.example.io", ignore_private: false), [r1, r2]

    assert_equal list.send(:select, "foo.io", ignore_private: true), [r1]
    assert_equal list.send(:select, "example.io", ignore_private: true), [r1]
    assert_equal list.send(:select, "foo.example.io", ignore_private: true), [r1]
  end


  def test_self_default_getter
    PublicSuffix::List.default = nil
    assert_nil(PublicSuffix::List.class_eval { @default })
    PublicSuffix::List.default
    refute_nil(PublicSuffix::List.class_eval { @default })
  end

  def test_self_default_setter
    PublicSuffix::List.default
    refute_nil(PublicSuffix::List.class_eval { @default })
    PublicSuffix::List.default = nil
    assert_nil(PublicSuffix::List.class_eval { @default })
  end

  def test_self_parse
    list = PublicSuffix::List.parse(<<EOS)
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

// ===BEGIN ICANN DOMAINS===

// com
com

// uk
*.uk
!british-library.uk

// ===END ICANN DOMAINS===
// ===BEGIN PRIVATE DOMAINS===

// Google, Inc.
blogspot.com

// ===END PRIVATE DOMAINS===
EOS

    assert_instance_of PublicSuffix::List, list
    assert_equal 4, list.size

    rules = %w( com *.uk !british-library.uk blogspot.com ).map { |name| PublicSuffix::Rule.factory(name) }
    assert_equal rules, list.each.to_a

    # private domains
    assert_equal false, list.find("com").private
    assert_equal true,  list.find("blogspot.com").private
  end


  private

  def list
    @_list ||= PublicSuffix::List.parse(<<EOS)
// com : http://en.wikipedia.org/wiki/.com
com

// uk : http://en.wikipedia.org/wiki/.uk
*.uk
*.sch.uk
!bl.uk
!british-library.uk
EOS
  end

end
