// 3rd_party_lib:commonmark4cj/build/release/commonmark4cj
// 3rd_party_lib_ohos:commonmark4cj/build/aarch64-linux-ohos/commonmark4cj
// dependence: z_test.cj

import commonmark4cj.commonmark.*
import std.unittest.*
import std.unittest.testmacro.*
import std.io.*
import std.collection.*

@Test
public class BlockNodeTest {
    @TestCase
    func documentTest(): Unit {
        var document: Document = Document ()
        var paragraph = Paragraph()
        var blockQuote = BlockQuote()
        var htmlBlock = HtmlBlock()
        var thematicBreak = ThematicBreak()
        var indentedCodeBlock = IndentedCodeBlock()
        var text = Text("text")
        document.appendChild(paragraph)
        document.appendChild(blockQuote)
        document.appendChild(htmlBlock)
        document.appendChild(thematicBreak)
        document.appendChild(indentedCodeBlock)
        document.appendChild(text)
        assertEquals("Document{}", blockQuote.getParent()().toString())
        assertEquals(None, document.getParent())
        htmlBlock.setLiteral("p1")
        assertEquals("p1", htmlBlock.getLiteral())
        assertEquals("HtmlBlock{}", thematicBreak.getPrevious()().toString())
        htmlBlock.insertBefore(Text("foo"))
        assertEquals("Text{literal=foo}", htmlBlock.getPrevious()().toString())
        assertEquals(true, paragraph != htmlBlock)
    }

    @TestCase
    func documentTest2(): Unit {
        var document: Document = Document ()
        var paragraph = Paragraph()
        document.prependChild(paragraph)
        assertEquals("Paragraph{}", document.getFirstChild()().toString())
    }

    @TestCase
    func documentTest3(): Unit {
        var indentedCodeBlock  = IndentedCodeBlock()
        indentedCodeBlock.setLiteral("foo")
        assertEquals("foo", indentedCodeBlock.getLiteral())
    }

    @TestCase
    func indentedCodeBlockTest(): Unit {
        var indentedCodeBlock  = IndentedCodeBlock()
        indentedCodeBlock.setLiteral("foo")
        assertEquals("foo", indentedCodeBlock.getLiteral())
    }

    @TestCase
    func fencedCodeBlockTest(): Unit {
        var fencedCodeBlock = FencedCodeBlock()
        fencedCodeBlock.setFenceChar(r'`')
        fencedCodeBlock.setFenceLength(1)
        fencedCodeBlock.setFenceIndent(1)
        fencedCodeBlock.setInfo("cangjie")
        fencedCodeBlock.setLiteral("var")
        assertEquals(r'`', fencedCodeBlock.getFenceChar())
        assertEquals(1, fencedCodeBlock.getFenceLength())
        assertEquals(1, fencedCodeBlock.getFenceIndent())
        assertEquals("cangjie", fencedCodeBlock.getInfo())
        assertEquals("var", fencedCodeBlock.getLiteral())
    }

    @TestCase
    func headingTest(): Unit {
        var Heading = Heading ()
        Heading.setLevel(1)
        assertEquals(1, Heading.getLevel())
    }

    @TestCase
    func bulletListTest(): Unit {
        var BulletList  = BulletList(r'*')
        assertEquals(r'*', BulletList.getBulletMarker())
        BulletList.setBulletMarker(r'$')
        assertEquals(r'$', BulletList.getBulletMarker())
    }

    @TestCase
    func orderedListTest(): Unit {
        var orderedList = OrderedList(1, r'.')
        assertEquals(1, orderedList.getStartNumber())
        assertEquals(r'.', orderedList.getDelimiter())
        orderedList.setStartNumber(2)
        orderedList.setDelimiter(r',')
        assertEquals(2, orderedList.getStartNumber())
        assertEquals(r',', orderedList.getDelimiter())
    }

    @TestCase
    func fencedCodeBlockTest1(): Unit {
        var fencedCodeBlock = FencedCodeBlock()
        fencedCodeBlock.setFenceLength(-9223372036854775808)
        fencedCodeBlock.setFenceIndent(-9223372036854775808)
        @Assert(fencedCodeBlock.getFenceLength(),-9223372036854775808)
        @Assert(fencedCodeBlock.getFenceIndent(),-9223372036854775808)
    }


    @TestCase
    func fencedCodeBlockTest2(): Unit {
        var fencedCodeBlock = FencedCodeBlock()
        fencedCodeBlock.setFenceLength(9223372036854775807)
        fencedCodeBlock.setFenceIndent(9223372036854775807)
        @Assert(fencedCodeBlock.getFenceLength(),9223372036854775807)
        @Assert(fencedCodeBlock.getFenceIndent(),9223372036854775807)
    }

    @TestCase
    func fencedCodeBlockTest3(): Unit {
        var fencedCodeBlock = FencedCodeBlock()
        fencedCodeBlock.setFenceLength(0)
        fencedCodeBlock.setFenceIndent(0)
        @Assert(fencedCodeBlock.getFenceLength(),0)
        @Assert(fencedCodeBlock.getFenceIndent(),0)
    }


    @TestCase
    func headingTest1(): Unit {
        var Heading = Heading ()
        Heading.setLevel(-9223372036854775808)
        @Assert(-9223372036854775808, Heading.getLevel())
    }

    @TestCase
    func headingTest2(): Unit {
        var Heading = Heading ()
        Heading.setLevel(9223372036854775807)
        @Assert(9223372036854775807, Heading.getLevel())
    }


    @TestCase
    func orderedListTest1(): Unit {
        var orderedList = OrderedList(9223372036854775807, r'.')
        @Assert(9223372036854775807, orderedList.getStartNumber())
        @Assert(r'.', orderedList.getDelimiter())
        orderedList.setStartNumber(9223372036854775807)
        orderedList.setDelimiter(r',')
        @Assert(9223372036854775807, orderedList.getStartNumber())
        @Assert(r',', orderedList.getDelimiter())
    }

    @TestCase
    func orderedListTest2(): Unit {
        var orderedList = OrderedList(0, r'.')
        @Assert(0, orderedList.getStartNumber())
        @Assert(r'.', orderedList.getDelimiter())
        orderedList.setStartNumber(-9223372036854775808)
        orderedList.setDelimiter(r'↗')
        @Assert(-9223372036854775808, orderedList.getStartNumber())
        @Assert(r'↗', orderedList.getDelimiter())
    }

    @TestCase
    func orderedListTest3(): Unit {
        var orderedList = OrderedList(0, r'.')
        @Assert(0, orderedList.getStartNumber())
        @Assert(r'.', orderedList.getDelimiter())
        orderedList.setStartNumber(0)
        orderedList.setDelimiter(r'仓')
        @Assert(0, orderedList.getStartNumber())
        @Assert(r'仓', orderedList.getDelimiter())
    }

    @TestCase
    func orderedListTest4(): Unit {
        var orderedList = OrderedList(0, r'.')
        @Assert(0, orderedList.getStartNumber())
        @Assert(r'.', orderedList.getDelimiter())
        orderedList.setStartNumber(0)
        orderedList.setDelimiter(r'③')
        @Assert(0, orderedList.getStartNumber())
        @Assert(r'③', orderedList.getDelimiter())
    }


    
    @TestCase
    func orderedListTest5(): Unit {
        var a=0
        try{
            BlockContinue.atIndex(-9223372036854775808)
            BlockContinue.atColumn(-9223372036854775808)
            BlockContinue.atIndex(9223372036854775807)
            BlockContinue.atColumn(9223372036854775807)
        } catch (e: Exception) {
            a++
        }
        @Assert(a ,0)
    }

}