/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* $Rev$ $Date$ */ /** * Test XML handling functions. */ #include #include "stream.hpp" #include "string.hpp" #include "list.hpp" #include "value.hpp" #include "element.hpp" #include "perf.hpp" #include "xml.hpp" #include "xml-test.hpp" namespace tuscany { namespace xml { const string currencyXML = "\n" "" "" "" "" "" "" "" "" "" "" "" "" "US" "" "\n"; const string customerXML = "\n" "" "jdoe" "
" "san francisco" "ca" "
" "" "1234" "1000" "" "" "6789" "2000" "" "" "4567" "3000" "" "
\n"; const string abcXML = "\n" "" "abc" "def" "xyz" "tuv" "\n"; const string xyzXML = "\n" "" "" "123" "abc" "" "" "234" "def" "" "" "345" "xyz" "" "" "456" "tuv" "" "\n"; const string boolXML = "\n" "true\n"; const string numberXML = "\n" "123.4\n"; const bool isName(const value& token) { return isTaggedList(token, attribute) && attributeName(token) == "name"; } const bool testReadXML() { { istringstream is(customerXML); const list c = content(readElements(streamList(is))); } { istringstream is(currencyXML); const list c = content(readElements(streamList(is))); const value composite = car(c); assert(isTaggedList(composite, element)); assert(elementName(composite) == "composite"); assert(attributeValue(car(filter(isName, elementChildren(composite)))) == string("currency")); } { istringstream is(boolXML); const list c = content(readElements(streamList(is))); assert(caddr(car(c)) == value(true)); } { istringstream is(numberXML); const list c = content(readElements(streamList(is))); assert(caddr(car(c)) == value(123.4)); } return true; } ostream* xmlWriter(const string& s, ostream* os) { (*os) << s; return os; } const bool testWriteXML() { { istringstream is(customerXML); const list c = content(readElements(streamList(is))); ostringstream os; writeElements(xmlWriter, &os, c); assert(str(os) == customerXML); } { istringstream is(currencyXML); const list c = content(readElements(streamList(is))); ostringstream os; writeElements(xmlWriter, &os, c); assert(str(os) == currencyXML); } return true; } const bool testElements() { { const list ad = mklist(mklist("city", string("san francisco")), mklist("state", string("ca"))); const list ac1 = mklist(mklist("id", string("1234")), mklist("balance", 1000)); const list ac2 = mklist(mklist("id", string("6789")), mklist("balance", 2000)); const list ac3 = mklist(mklist("id", string("4567")), mklist("balance", 3000)); { const list c = mklist(mklist("customer", mklist("name", string("jdoe")), cons("address", ad), mklist("account", mklist(ac1, ac2, ac3)))); const list e = valuesToElements(c); const list v = elementsToValues(e); assert(v == c); ostringstream os; writeElements(xmlWriter, &os, e); assert(str(os) == customerXML); } { const list c = mklist(mklist("customer", mklist("name", string("jdoe")), cons("address", ad), cons("account", ac1), cons("account", ac2), cons("account", ac3))); const list e = valuesToElements(c); const list v = elementsToValues(e); ostringstream os; writeElements(xmlWriter, &os, e); assert(str(os) == customerXML); } } { istringstream is(abcXML); const list c = content(readElements(streamList(is))); const list v = elementsToValues(c); const list e = valuesToElements(v); ostringstream os; writeElements(xmlWriter, &os, e); assert(str(os) == abcXML); } { istringstream is(xyzXML); const list c = content(readElements(streamList(is))); const list v = elementsToValues(c); const list e = valuesToElements(v); ostringstream os; writeElements(xmlWriter, &os, e); assert(str(os) == xyzXML); } { istringstream is(customerXML); const list c = content(readElements(streamList(is))); const list v = elementsToValues(c); const list e = valuesToElements(v); ostringstream os; writeElements(xmlWriter, &os, e); assert(str(os) == customerXML); } return true; } const bool testValues() { { const list l = mklist(nilListValue + "ns1:echoString" + (nilListValue + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (nilListValue + "text" + string("Hello World!"))); const list e = valuesToElements(l); const failable > lx = writeElements(e); ostringstream os; write(content(lx), os); istringstream is(str(os)); const list x = content(readElements(streamList(is))); const list v = elementsToValues(x); assert(v == l); } return true; } const bool testReadWrite() { const gc_scoped_pool pool; istringstream is(customerXML); const list il = streamList(is); const list r = elementsToValues(content(readElements(il))); ostringstream os; writeElements(xmlWriter, &os, valuesToElements(r)); //assert(str(os) == customerXML); return true; } const bool testReadWritePerf() { const gc_scoped_pool pool; const blambda rwl = blambda(testReadWrite); cout << "XML read + write test " << time(rwl, 5, 200) << " ms" << endl; return true; } const bool testReadWriteBigDoc() { const gc_scoped_pool pool; istringstream is(testBigDoc); const list il = streamList(is); const list r = elementsToValues(content(readElements(il))); ostringstream os; writeElements(xmlWriter, &os, valuesToElements(r)); //assert(str(os) == testBigDoc); return true; } const bool testReadWriteBigDocPerf() { const gc_scoped_pool pool; const blambda rwl = blambda(testReadWriteBigDoc); cout << "XML big doc read + write test " << time(rwl, 5, 200) << " ms" << endl; return true; } const string customersXML = "\n" "" "" "jane doe" "
" "san francisco" "ca" "
" "" "1234" "1000" "" "" "6789" "4000" "" "
" "" "john doe" "
" "new york" "ny" "
" "" "5678" "2000" "" "" "4321" "1000" "" "
" "
\n"; const bool testQuery() { { const gc_scoped_pool pool; // Read XML doc containing customers istringstream is(customersXML); const list c = content(readElements(streamList(is))); //cout << c << endl; // Map list of customers to a list of (customer name, customer balance) pairs const list nb = map([](value e) -> const value { // Map list of accounts to a list of balances list bals = map([](value e) -> const value { return (double)elementValue(elementChild("balance", e)); }, elementChildren("account", e)); // Reduce list of balances to compute customer balance value total = reduce([](value accum, value v) -> const value { return (double)accum + (double)v; }, value(0), bals); // Return (customer name, customer balance) pair return mklist(elementValue(elementChild("name", e)), total); }, elementChildren("customer", elementChild("customers", c))); // The resulting list of (customer name, customer balance) pairs //cout << nb << endl; assert(nb == mklist(mklist("jane doe", 5000), mklist("john doe", 3000))); } return true; } } } int main() { const tuscany::gc_scoped_pool p; tuscany::cout << "Testing..." << tuscany::endl; tuscany::xml::testReadXML(); tuscany::xml::testWriteXML(); tuscany::xml::testElements(); tuscany::xml::testValues(); tuscany::xml::testReadWritePerf(); tuscany::xml::testReadWriteBigDocPerf(); tuscany::xml::testQuery(); tuscany::cout << "OK" << tuscany::endl; return 0; }