# frozen_string_literal: true

require "test_helper"

module CommonMarker
  class TestMaliciousness < Minitest::Test
    def setup
      @doc = CommonMarker.render_doc("Hi *there*")
    end

    def test_init_with_bad_type
      assert_raises(TypeError) do
        Node.new(123)
      end

      assert_raises(NodeError) do
        Node.new(:totes_fake)
      end

      assert_raises(TypeError) do
        Node.new([])
      end

      assert_raises(TypeError) do
        Node.new([23])
      end

      assert_raises(TypeError) do
        Node.new(nil)
      end
    end

    def test_rendering_with_bad_type
      assert_raises(TypeError) do
        CommonMarker.render_html("foo \n baz", 123)
      end

      assert_raises(TypeError) do
        CommonMarker.render_html("foo \n baz", :totes_fake)
      end

      assert_raises(TypeError) do
        CommonMarker.render_html("foo \n baz", [])
      end

      assert_raises(TypeError) do
        CommonMarker.render_html("foo \n baz", [23])
      end

      assert_raises(TypeError) do
        CommonMarker.render_html("foo \n baz", nil)
      end

      assert_raises(TypeError) do
        CommonMarker.render_html("foo \n baz", [:SMART, "totes_fake"])
      end

      assert_raises(TypeError) do
        CommonMarker.render_html(123)
      end

      assert_raises(TypeError) do
        CommonMarker.render_html([123])
      end

      assert_raises(TypeError) do
        CommonMarker.render_html(nil)
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", 123)
      end

      err = assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", :safe)
      end
      assert_equal("option ':safe' does not exist for CommonMarker::Config::OPTS[:parse]", err.message)

      assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", :totes_fake)
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", [])
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", [23])
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", nil)
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc("foo \n baz", [:SMART, "totes_fake"])
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc(123)
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc([123])
      end

      assert_raises(TypeError) do
        CommonMarker.render_doc(nil)
      end
    end

    def test_bad_set_string_content
      assert_raises(TypeError) do
        @doc.string_content = 123
      end
    end

    def test_bad_walking
      assert_nil(@doc.parent)
      assert_nil(@doc.previous)
    end

    def test_bad_insertion
      code = Node.new(:code)
      assert_raises(NodeError) do
        @doc.insert_before(code)
      end

      paragraph = Node.new(:paragraph)
      assert_raises(NodeError) do
        @doc.insert_after(paragraph)
      end

      document = Node.new(:document)
      assert_raises(NodeError) do
        @doc.prepend_child(document)
      end

      assert_raises(NodeError) do
        @doc.append_child(document)
      end
    end

    def test_bad_url_get
      assert_raises(NodeError) do
        @doc.url
      end
    end

    def test_bad_url_set
      assert_raises(NodeError) do
        @doc.url = "123"
      end

      link = CommonMarker.render_doc("[GitHub](https://www.github.com)").first_child.first_child
      assert_raises(TypeError) do
        link.url = 123
      end
    end

    def test_bad_title_get
      assert_raises(NodeError) do
        @doc.title
      end
    end

    def test_bad_title_set
      assert_raises(NodeError) do
        @doc.title = "123"
      end

      image = CommonMarker.render_doc('![alt text](https://github.com/favicon.ico "Favicon")')
      image = image.first_child.first_child
      assert_raises(TypeError) do
        image.title = 123
      end
    end

    def test_bad_header_level_get
      assert_raises(NodeError) do
        @doc.header_level
      end
    end

    def test_bad_header_level_set
      assert_raises(NodeError) do
        @doc.header_level = 1
      end

      header = CommonMarker.render_doc("### Header Three").first_child
      assert_raises(TypeError) do
        header.header_level = "123"
      end
    end

    def test_bad_list_type_get
      assert_raises(NodeError) do
        @doc.list_type
      end
    end

    def test_bad_list_type_set
      assert_raises(NodeError) do
        @doc.list_type = :bullet_list
      end

      ul_list = CommonMarker.render_doc("* Bullet\n*Bullet").first_child
      assert_raises(NodeError) do
        ul_list.list_type = :fake
      end
      assert_raises(TypeError) do
        ul_list.list_type = 1234
      end
    end

    def test_bad_list_start_get
      assert_raises(NodeError) do
        @doc.list_start
      end
    end

    def test_bad_list_start_set
      assert_raises(NodeError) do
        @doc.list_start = 12
      end

      ol_list = CommonMarker.render_doc("1. One\n2. Two").first_child
      assert_raises(TypeError) do
        ol_list.list_start = :fake
      end
    end

    def test_bad_list_tight_get
      assert_raises(NodeError) do
        @doc.list_tight
      end
    end

    def test_bad_list_tight_set
      assert_raises(NodeError) do
        @doc.list_tight = false
      end
    end

    def test_bad_fence_info_get
      assert_raises(NodeError) do
        @doc.fence_info
      end
    end

    def test_bad_fence_info_set
      assert_raises(NodeError) do
        @doc.fence_info = "ruby"
      end

      fence = CommonMarker.render_doc("``` ruby\nputs 'wow'\n```").first_child
      assert_raises(TypeError) do
        fence.fence_info = 123
      end
    end
  end
end
