! Copyright (C) 2005, 2009 Daniel Ehrenberg
! See http://factorcode.org/license.txt for BSD license.
USING: xml io kernel math sequences strings xml.traversal
tools.test math.parser xml.syntax xml.data xml.syntax.private
accessors multiline locals inverse xml.writer splitting classes
xml.private ;
IN: xml.syntax.tests
! TAGS test
TAGS: calculate ( tag -- n )
: calc-2children ( tag -- n n )
children-tags first2 [ calculate ] dip calculate ;
TAG: number calculate
children>string string>number ;
TAG: add calculate
calc-2children + ;
TAG: minus calculate
calc-2children - ;
TAG: times calculate
calc-2children * ;
TAG: divide calculate
calc-2children / ;
TAG: neg calculate
children-tags first calculate neg ;
: calc-arith ( string -- n )
string>xml first-child-tag calculate ;
{ 32 } [
""
calc-arith
] unit-test
XML-NS: foo http://blah.com
{ T{ name { main "bling" } { url "http://blah.com" } } } [ "bling" foo ] unit-test
! XML literals
{ "a" "c" { "a" "c" f } } [
"<-a->/><->"
string>doc
[ second var>> ]
[ fourth "val" attr var>> ]
[ extract-variables ] tri
] unit-test
{ "
one
y
" } [
let[ "one" :> a "two" :> c "y" :> x XML-CHUNK[[ <-x-> ]] :> d
XML-DOC[[
<-a-> /> <-d->
]] pprint-xml>string
]
] unit-test
{ "
-
one
-
two
-
three
" } [
"one two three" " " split
[ XML-CHUNK[[ - <->
]] ] map
XML-DOC[[ <-> ]] pprint-xml>string
] unit-test
{ "
" }
[ 3 f "http://factorcode.org/" "hello" \ drop
XML-DOC[[ false=<-> url=<-> string=<-> word=<->/> ]]
pprint-xml>string ] unit-test
{ "3" } [ 3 XML-CHUNK[[ <-> ]] xml>string ] unit-test
{ "" } [ f XML-CHUNK[[ <-> ]] xml>string ] unit-test
[ XML-CHUNK[[ <-> ]] ] must-infer
[ XML-CHUNK[[ <-> /> ]] ] must-infer
{ xml-chunk } [ [ XML-CHUNK[[ ]] ] first class-of ] unit-test
{ xml } [ [ XML-DOC[[ ]] ] first class-of ] unit-test
{ xml-chunk } [ [ XML-CHUNK[[ /> ]] ] third class-of ] unit-test
{ xml } [ [ XML-DOC[[ /> ]] ] third class-of ] unit-test
{ 1 } [ [ XML-CHUNK[[ ]] ] length ] unit-test
{ 1 } [ [ XML-DOC[[ ]] ] length ] unit-test
{ "" } [ XML-CHUNK[[ ]] concat ] unit-test
{ "foo" } [ XML-CHUNK[[ foo ]] [ XML-CHUNK[[ <-> ]] ] undo ] unit-test
{ "foo" } [ XML-CHUNK[[ ]] [ XML-CHUNK[[ /> ]] ] undo ] unit-test
{ "foo" "baz" } [ XML-CHUNK[[ baz ]] [ XML-CHUNK[[ ><-> ]] ] undo ] unit-test
: dispatch ( xml -- string )
{
{ [ XML-CHUNK[[ <-> ]] ] [ "a" prepend ] }
{ [ XML-CHUNK[[ <-> ]] ] [ "b" prepend ] }
{ [ XML-CHUNK[[ ]] ] [ "byes" ] }
{ [ XML-CHUNK[[ /> ]] ] [ "bno" prepend ] }
} switch ;
{ "apple" } [ XML-CHUNK[[ pple ]] dispatch ] unit-test
{ "banana" } [ XML-CHUNK[[ anana ]] dispatch ] unit-test
{ "byes" } [ XML-CHUNK[[ ]] dispatch ] unit-test
{ "bnowhere" } [ XML-CHUNK[[ ]] dispatch ] unit-test
{ "baboon" } [ XML-CHUNK[[ aboon ]] dispatch ] unit-test
{ "apple" } [ XML-DOC[[ pple ]] dispatch ] unit-test
{ "apple" } [ XML-DOC[[ pple ]] body>> dispatch ] unit-test
: dispatch-doc ( xml -- string )
{
{ [ XML-DOC[[ <-> ]] ] [ "a" prepend ] }
{ [ XML-DOC[[ <-> ]] ] [ "b" prepend ] }
{ [ XML-DOC[[ ]] ] [ "byes" ] }
{ [ XML-DOC[[ /> ]] ] [ "bno" prepend ] }
} switch ;
{ "apple" } [ XML-DOC[[ pple ]] dispatch-doc ] unit-test
{ "apple" } [ XML-CHUNK[[ pple ]] dispatch-doc ] unit-test
{ "apple" } [ XML-DOC[[ pple ]] body>> dispatch-doc ] unit-test
! Make sure nested XML documents interpolate correctly
{
"it's blue!"
} [
"it's blue!" XML-DOC[[ <-> ]]
XML-DOC[[ <-> ]] xml>string
] unit-test
{
"asdfasdf2"
} [
default-prolog
"asdf"
"asdf" f f
"asdf2"
XML-DOC[[ <-> ]] xml>string
] unit-test