# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
#                    Fabien Morin <fabien@nexedi.com>
#                    Tatuya Kamada <tatuya@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
# USA.
#
##############################################################################

import unittest
import transaction
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.backportUnittest import skip
from Products.ERP5OOo.tests.testFormPrintout import TestFormPrintoutMixin
from Products.ERP5Type.tests.utils import createZODBPythonScript
from Products.MimetypesRegistry.mime_types.magic import guessMime
from Products.ERP5OOo.OOoUtils import OOoBuilder
from Products.ERP5OOo.tests.utils import Validator
from Products.ERP5Type.tests.utils import FileUpload
from DateTime import DateTime
from lxml import etree
import os

class TestFormPrintoutAsODT(TestFormPrintoutMixin):

  def getTitle(self):
    """
      Return the title of the current test set.
    """
    return "FormPrintout"

  def afterSetUp(self):
    self.login()
    self.setSystemPreference()
    # XML validator
    v12schema_url = os.path.join(os.path.dirname(__file__),
                                 'OpenDocument-schema-v1.2-draft9.rng')
    self.validator = Validator(schema_url=v12schema_url)

    foo_file_path = os.path.join(os.path.dirname(__file__),
                                'test_document',
                                'Foo_001.odt')
    foo2_file_path = os.path.join(os.path.dirname(__file__),
                                  'test_document',
                                  'Foo_002.odt')
    foo3_file_path = os.path.join(os.path.dirname(__file__),
                                  'test_document',
                                  'Foo_003.odt')
    foo4_file_path = os.path.join(os.path.dirname(__file__),
                                  'test_document',
                                  'Foo_004.odt')
    foo5_file_path = os.path.join(os.path.dirname(__file__),
                                  'test_document',
                                  'Foo_005.odt')
    variable_file_path = os.path.join(os.path.dirname(__file__),
                                  'test_document',
                                  'Foo_001_with_variable.odt')
    foo_file = open(foo_file_path, 'rb')
    foo2_file = open(foo2_file_path, 'rb')
    foo3_file = open(foo3_file_path, 'rb')
    foo4_file = open(foo4_file_path, 'rb')
    foo5_file = open(foo5_file_path, 'rb')
    variable_file_object = open(variable_file_path, 'rb')
    custom = self.portal.portal_skins.custom
    addStyleSheet = custom.manage_addProduct['OFSP'].manage_addFile
    if custom._getOb('Foo_getODTStyleSheet', None) is None:
      addStyleSheet(id='Foo_getODTStyleSheet', file=foo_file, title='',
                    precondition='', content_type = 'application/vnd.oasis.opendocument.text')
    if custom._getOb('Foo2_getODTStyleSheet', None) is None:
      addStyleSheet(id='Foo2_getODTStyleSheet', file=foo2_file, title='',
                    precondition='', content_type = 'application/vnd.oasis.opendocument.text')
    if custom._getOb('Foo3_getODTStyleSheet', None) is None:
      addStyleSheet(id='Foo3_getODTStyleSheet', file=foo3_file, title='',
                    precondition='', content_type = 'application/vnd.oasis.opendocument.text')
    if custom._getOb('Foo4_getODTStyleSheet', None) is None:
      addStyleSheet(id='Foo4_getODTStyleSheet', file=foo4_file, title='',
                    precondition='', content_type = 'application/vnd.oasis.opendocument.text')
    if custom._getOb('Foo5_getODTStyleSheet', None) is None:
      addStyleSheet(id='Foo5_getODTStyleSheet', file=foo5_file, title='',
                    precondition='', content_type = 'application/vnd.oasis.opendocument.text')
    if custom._getOb('Foo_getVariableODTStyleSheet', None) is None:
      addStyleSheet(id='Foo_getVariableODTStyleSheet',
                    file=variable_file_object, title='',
                    precondition='',
                    content_type='application/vnd.oasis.opendocument.text')
    erp5OOo = custom.manage_addProduct['ERP5OOo']
    addOOoTemplate = erp5OOo.addOOoTemplate
    if custom._getOb('Foo_viewAsOdt', None) is None:
      addOOoTemplate(id='Foo_viewAsOdt', title='')
    request = self.app.REQUEST
    Foo_viewAsOdt = custom.Foo_viewAsOdt
    Foo_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
                             ooo_stylesheet='Foo_getODTStyleSheet')
    #Foo_viewAsOdt.pt_upload(request, file=foo_file)
    #render_result = Foo_viewAsOdt(REQUEST=request)
    builder = OOoBuilder(foo_file)
    content = builder.extract('content.xml')
    Foo_viewAsOdt.pt_edit(content, content_type='application/vnd.oasis.opendocument.text')
    if custom._getOb('Foo_viewAsPrintout', None) is None:
      erp5OOo.addFormPrintout(id='Foo_viewAsPrintout', title='',
                              form_name='Foo_view', template='Foo_getODTStyleSheet')
    if custom._getOb('FooReport_viewAsPrintout', None) is None:
      erp5OOo.addFormPrintout(id='FooReport_viewAsPrintout',
                              title='')
    if custom._getOb('Foo5_viewAsPrintout', None) is None:
      erp5OOo.addFormPrintout(id='Foo5_viewAsPrintout', title='',
                              form_name='Foo_view', template='Foo5_getODTStyleSheet')

    ## append 'test1' data to a listbox
    foo_module = self.portal.foo_module
    if foo_module._getOb('test1', None) is None:
      foo_module.newContent(id='test1', portal_type='Foo')
    test1 =  foo_module.test1
    if test1._getOb("foo_1", None) is None:
      test1.newContent("foo_1", portal_type='Foo Line')
    if test1._getOb("foo_2", None) is None:
      test1.newContent("foo_2", portal_type='Foo Line')
    transaction.commit()
    self.tic()

  def test_01_Paragraph(self):
    """
    mapping a field to a paragraph
    """
    portal = self.getPortal()
    foo_module = self.portal.foo_module
    if foo_module._getOb('test1', None) is None:
      foo_module.newContent(id='test1', portal_type='Foo')
    test1 =  foo_module.test1
    test1.setTitle('Foo title!')
    transaction.commit()
    self.tic()

    # test target
    foo_printout = portal.foo_module.test1.Foo_viewAsPrintout
    self._validate(self.getODFDocumentFromPrintout(foo_printout))

    request = self.app.REQUEST
    # 1. Normal case: "my_title" field to the "my_title" reference in the ODF document
    self.portal.changeSkin('ODT')
    odf_document = foo_printout.index_html(REQUEST=request)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("Foo title!") > 0)
    self.assertEqual(request.RESPONSE.getHeader('content-type'),
                     'application/vnd.oasis.opendocument.text')
    self.assertEqual(request.RESPONSE.getHeader('content-disposition'),
                     'inline;filename="Foo_viewAsPrintout.odt"')
    self._validate(odf_document)

    # 2. Normal case: change the field value and check again the ODF document
    test1.setTitle("Changed Title!")
    #foo_form.my_title.set_value('default', "Changed Title!")
    odf_document = foo_printout.index_html(REQUEST=request)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("Changed Title!") > 0)
    self._validate(odf_document)

    # 3. False case: change the field name
    test1.setTitle("you cannot find")
    # rename id 'my_title' to 'xxx_title', then does not match in the ODF document
    foo_form = portal.foo_module.test1.Foo_view
    foo_form.manage_renameObject('my_title', 'xxx_title', REQUEST=request)
    odf_document = foo_printout.index_html(REQUEST=request)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("you cannot find") > 0)
    self._validate(odf_document)
    # put back
    foo_form.manage_renameObject('xxx_title', 'my_title', REQUEST=request)

    ## 4. False case: does not set a ODF template
    self.assertTrue(foo_printout.template == 'Foo_getODTStyleSheet')
    tmp_template = foo_printout.template
    foo_printout.template = None
    self.assertRaises(ValueError, foo_printout.index_html, request)
    # put back
    foo_printout.template = tmp_template

    # 5. Normal case: just call a FormPrintout object
    request.RESPONSE.setHeader('Content-Type', 'text/html')
    test1.setTitle("call!")
    odf_document = foo_printout(request, batch_mode=True) # call
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("call!") > 0)
    self.assertEqual(request.RESPONSE.getHeader('content-type'), 'text/html')
    self._validate(odf_document)

    # 5. Normal case: utf-8 string
    test1.setTitle("Français")
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("Français") > 0)
    self._validate(odf_document)

    # 6. Normal case: unicode string
    test1.setTitle(u'Français test2')
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("Français test2") > 0)
    self._validate(odf_document)

    # 7. Change Filename of downloadable file
    reference = 'My Reference'
    test1.setReference(reference)
    foo_printout.filename = 'here/getReference'
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertEqual(request.RESPONSE.getHeader('content-disposition'),
                     'inline;filename="%s.odt"' % reference)
    test1.setReference(None)

  def test_01_Paragraph_07_LinesField(self):
    """test LinesField into multi line"""
    foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
    foo_form = self.portal.foo_module.test1.Foo_view
    if foo_form._getOb("week", None) is None:
      foo_form.manage_addField('week', 'week', 'LinesField')
    week = foo_form.week
    week.values['default'] = ['line1', 'line2']

    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    #test_output = open("/tmp/test_01_Paragraph_07_LinesField.odf", "w")
    #test_output.write(odf_document)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    content_tree = etree.XML(content_xml)
    span_list = content_tree.xpath('//text:reference-mark-start[@text:name="week"]/following-sibling::text:span',
                                   namespaces=content_tree.nsmap)
    if span_list:
      self.assertEquals(1, len(span_list))
      span = span_list[0]
      self.assertEquals('line1', span.text)
      self.assertEquals('line2', span[0].tail)
    else:
      reference_mark_node = content_tree.xpath('//text:reference-mark-start[@text:name="week"][1]',
                                               namespaces=content_tree.nsmap)[0]
      self.assertEquals('line1', reference_mark_node.tail)
      self.assertEquals('line2', reference_mark_node.getnext().tail)
    self._validate(odf_document)

  def test_01_Paragraph_08_Field_Format(self):
    """test a field with format"""
    foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
    foo_form = self.portal.foo_module.test1.Foo_view
    if foo_form._getOb("number", None) is None:
      foo_form.manage_addField('number', 'number', 'FloatField')
    number = foo_form.number
    number.values['default'] = '543210'
    # set a float field format
    number.values['input_style'] = '-1 234.5'
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    #test_output = open("/tmp/test_01_Paragraph_08_Filed_Format.odf", "w")
    #test_output.write(odf_document)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    content = etree.XML(content_xml)
    self.assertTrue(content.xpath('//text:p[text() = "543 210.0"]', namespaces=content.nsmap))
    self._validate(odf_document)

    # change format
    number.values['input_style'] = '-1234.5'
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    content = etree.XML(content_xml)
    self.assertTrue(content.xpath('//text:p = "543210.0"', namespaces=content.nsmap))

    self._validate(odf_document)

  def test_01_Paragraph_09_RangeReferenceWithSpan(self):
    """test range reference and span setting"""
    foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
    foo_form = self.portal.foo_module.test1.Foo_view
    if foo_form._getOb("my_test_title", None) is None:
      foo_form.manage_addField('my_test_title', 'test title', 'StringField')
    test_title = foo_form.my_test_title
    test_title.values['default'] = 'ZZZ test here ZZZ'

    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    #test_output = open("/tmp/test_01_Paragraph_09_RangeReferenceWithSpan.odf", "w")
    #test_output.write(odf_document)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("ZZZ test here ZZZ") > 0)
    self.assertTrue(content_xml.find("test title") < 0)
    self._validate(odf_document)

  def test_02_Table_01_Normal(self):
    """To test listbox and ODF table mapping

     * Test Data Format

     ODF table named 'listbox':
     +------------------------------+
     |  ID | Title | Quantity |Date |
     |-----+-------+----------+-----|
     |     |       |          |     |
     |-----+-------+----------+-----|
     |   Total     |          |     |
     +------------------------------+
    """
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    # 1. Normal Case: ODF table last row is stat line
    test1.foo_1.setTitle('foo_title_1')
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = 'portal_catalog',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox.get_value('default', render_format = 'list',
                                         REQUEST = request)
    self.assertEqual(len(listboxline_list), 4)
    self.assertTrue(listboxline_list[0].isTitleLine())
    self.assertTrue(listboxline_list[1].isDataLine())
    self.assertTrue(listboxline_list[2].isDataLine())
    self.assertTrue(listboxline_list[3].isStatLine())
    column_list = listboxline_list[0].getColumnPropertyList()
    self.assertEqual(len(column_list), 4)
    self.assertTrue(listboxline_list[1].getColumnProperty('id') == "foo_1")
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_1")

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_01_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("foo_title_1") > 0)
    self._validate(odf_document)

  def test_02_Table_02_SmallerThanListboxColumns(self):
    """2. Irregular case: listbox columns count smaller than table columns count"""
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    test1.foo_1.setTitle('foo_title_2')
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = 'portal_catalog',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity',)
    self.failUnless('Set Successfully' in message)
    self.assertEqual(listbox.get_value('columns'),
                     [('id', 'ID'), ('title', 'Title'), ('quantity', 'Quantity')])
    listboxline_list = listbox.get_value('default', render_format = 'list',
                                         REQUEST = request)
    self.assertEqual(len(listboxline_list), 4)
    self.assertTrue(listboxline_list[0].isTitleLine())
    self.assertTrue(listboxline_list[1].isDataLine())
    self.assertTrue(listboxline_list[2].isDataLine())
    self.assertTrue(listboxline_list[3].isStatLine())
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_2")

    column_list = listboxline_list[0].getColumnPropertyList()
    self.assertEqual(len(column_list), 3)

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_02_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_title_1") > 0)
    self.assertTrue(content_xml.find("foo_title_2") > 0)
    self._validate(odf_document)

  def test_02_Table_03_ListboxColumnsLargerThanTable(self):
    """3. Irregular case: listbox columns count larger than table columns count"""
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    test1.foo_1.setTitle('foo_title_3')
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = 'portal_catalog',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\n'
                      'start_date|Date\nstatus|Status',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox.get_value('default', render_format = 'list',
                                         REQUEST = request)
    self.assertEqual(len(listboxline_list), 4)
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_3")

    column_list = listboxline_list[0].getColumnPropertyList()
    self.assertEqual(len(column_list), 5)
    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_03_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_title_2") > 0)
    self.assertTrue(content_xml.find("foo_title_3") > 0)
    self._validate(odf_document)

  def test_02_Table_04_ListboxHasNotStat(self):
    """4. Irregular case: listbox has not a stat line, but table has a stat line"""
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    test1.foo_1.setTitle('foo_title_4')
    test1.foo_1.setStartDate('2009-01-01')
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = '',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox.get_value('default', render_format = 'list',
                                         REQUEST = request)
    for line in listboxline_list:
      self.assertEqual(line.isStatLine(), False)
    self.assertEqual(len(listboxline_list), 3)
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_4")

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_04_Table.odf", "w")
    #test_output.write(odf_document)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(odf_document is not None)
    self.assertFalse(content_xml.find("foo_title_3") > 0)
    self.assertTrue(content_xml.find("foo_title_4") > 0)

    content = etree.XML(content_xml)
    table_row_xpath = '//table:table[@table:name="listbox"]/table:table-row'
    odf_table_rows = content.xpath(table_row_xpath, namespaces=content.nsmap)
    self.assertEqual(len(odf_table_rows), 2)
    # to test copying ODF table cell styles
    first_row = odf_table_rows[0]
    first_row_columns = first_row.getchildren()
    last_row = odf_table_rows[-1]
    last_row_columns = last_row.getchildren()
    span_attribute = "{%s}number-columns-spanned" % content.nsmap['table']
    self.assertFalse(first_row_columns[0].attrib.has_key(span_attribute))
    self.assertEqual(int(last_row_columns[0].attrib[span_attribute]), 2)
    self._validate(odf_document)

  def test_02_Table_05_NormalSameLayout(self):
    """5. Normal case: the listobx and the ODF table are same layout

    * Test Data Format:

     ODF table named 'listbox2'
     +-------------------------------+
     |  A    |   B   |   C   |   D   |
     |-------+-------+-------+-------|
     |       |       |       |       |
     +-------+-------+-------+-------+
    """
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    foo_form.manage_renameObject('listbox', 'listbox2', REQUEST=request)
    listbox2 = foo_form.listbox2
    test1.foo_1.setTitle('foo_title_5')
    message = listbox2.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = 'portal_catalog',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox2.get_value('default', render_format = 'list',
                                         REQUEST = request)
    self.assertEqual(len(listboxline_list), 4)
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_5")

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_05_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    content_tree = etree.XML(content_xml)
    #Check that foo_1 is inside table, with the same style
    xpath_style_name_expression = '//table:table[@table:name="listbox2"]/table:table-row/table:table-cell/text:p[@text:style-name="P4"]/text()'
    self.assertEquals(['foo_1', 'foo_2'], content_tree.xpath(xpath_style_name_expression, namespaces=content_tree.nsmap))
    #Check that each listbox values are inside ODT table cells
    xpath_result_expression = '//table:table[@table:name="listbox2"]/table:table-row/table:table-cell/text:p/text()'
    self.assertEquals(['foo_1', 'foo_title_5', 'foo_2', 'foo_2', '1234.5'], content_tree.xpath(xpath_result_expression, namespaces=content_tree.nsmap))
    self.assertFalse(content_xml.find("foo_title_4") > 0)
    self._validate(odf_document)

    # put back the field name
    foo_form.manage_renameObject('listbox2', 'listbox', REQUEST=request)

  def test_02_Table_06_TableDoesNotHaveAHeader(self):
    """6. Normal case: ODF table does not have a header
     * Test Data format:

     ODF table named 'listbox3'
     the table listbox3 has not table header.
     first row is a table content, too.
     +-------------------------------+
     |  1    |   2   |   3   |   4   |
     |-------+-------+-------+-------|
     |       |       |       |       |
     +-------+-------+-------+-------+
    """
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    foo_form.manage_renameObject('listbox', 'listbox3', REQUEST=request)
    listbox3 = foo_form.listbox3
    test1.foo_1.setTitle('foo_title_6')
    message = listbox3.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = 'portal_catalog',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox3.get_value('default', render_format = 'list',
                                         REQUEST = request)
    self.assertEqual(len(listboxline_list), 4)
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_6")

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_06_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_title_5") > 0)
    self.assertTrue(content_xml.find("foo_title_6") > 0)
    self._validate(odf_document)

    # put back the field name
    foo_form.manage_renameObject('listbox3', 'listbox', REQUEST=request)

  def test_02_Table_07_CellFormat(self):
    """7. Normal case: make sure that it is enable to use ODF cell format setting in FormPrintout"""
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    test1.foo_1.setTitle('foo_title_7')
    test1.foo_1.setStartDate(DateTime(2009,4,20))
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_stat_method = 'portal_catalog',
      field_stat_columns = 'quantity | Foo_statQuantity',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox.get_value('default', render_format = 'list',
                                         REQUEST = request)
    self.assertEqual(len(listboxline_list), 4)
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_7")

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_07_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_title_6") > 0)
    self.assertTrue(content_xml.find("foo_title_7") > 0)

    content = etree.XML(content_xml)
    table_row_xpath = '//table:table[@table:name="listbox"]/table:table-row'
    odf_table_rows = content.xpath(table_row_xpath, namespaces=content.nsmap)
    self.assertEqual(len(odf_table_rows), 3)
    # to test ODF table cell number format
    first_row = odf_table_rows[0]
    first_row_columns = first_row.getchildren()
    date_column = first_row_columns[3]
    date_value_attrib = "{%s}date-value" % content.nsmap['office']
    self.assertTrue(date_column.attrib.has_key(date_value_attrib))
    self.assertEqual(date_column.attrib[date_value_attrib], '2009-04-20')
    self._validate(odf_document)

  def test_02_Table_08_Nodata(self):
    """8. Normal case: list box has no data"""
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    test1.foo_1.setTitle('foo_title_8')
    message = listbox.ListBox_setPropertyList(
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox.get_value('default', render_format = 'list',
                                         REQUEST = request)
    # title line only
    self.assertEqual(len(listboxline_list), 1)

    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_08_Table.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")

    content = etree.XML(content_xml)
    table_row_xpath = '//table:table[@table:name="listbox"]/table:table-row'
    odf_table_rows = content.xpath(table_row_xpath, namespaces=content.nsmap)
    # no rows
    self.assertEqual(len(odf_table_rows), 0)
    self._validate(odf_document)

  def test_02_Table_09_StyleSetting(self):
    """ 9. Normal case: setting the style of the row.

     * Test Data format:
     The table listbox4 has six rows which contains the reference of the row.
    """
    # test target
    test1 = self.portal.foo_module.test1
    foo_printout = test1.Foo_viewAsPrintout
    foo_form = test1.Foo_view
    listbox = foo_form.listbox
    request = self.app.REQUEST
    request['here'] = test1

    for i in xrange(3, 7):
      foo_id = "foo_%s" % i
      if test1._getOb(foo_id, None) is None:
        test1.newContent(foo_id, portal_type='Foo Line')

    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'Foo_getRowCssList',
      '*args,**kw',
r"""
line_index = kw['list_index']
line_number = line_index + 1
for n in xrange(6, 0, -1):
  if line_number % n is 0:
    return "line" + str(n)
"""
      )

    foo_form.manage_renameObject('listbox', 'listbox4', REQUEST=request)
    listbox4 = foo_form.listbox4
    test1.foo_1.setTitle('foo_title_9')
    message = listbox4.ListBox_setPropertyList(
      field_list_method = 'objectValues',
      field_portal_types = 'Foo Line | Foo Line',
      field_row_css_method = 'Foo_getRowCssList',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity',)
    self.failUnless('Set Successfully' in message)
    listboxline_list = listbox4.get_value('default', render_format = 'list',
                                          REQUEST = request)
    self.assertEqual(len(listboxline_list), 7)
    self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_9")

    ## test
    odf_document = foo_printout.index_html(REQUEST=request)
    #test_output = open("/tmp/test_02_Table_09_StyleSetting.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("foo_title_9") > 0)

    content = etree.XML(content_xml)
    table_row_xpath = '//table:table[@table:name="listbox4"]/table:table-row'
    table_row_list = content.xpath(table_row_xpath, namespaces=content.nsmap)
    self.assertEqual(len(table_row_list), 6)

    line2 = table_row_list[1]
    line2_cell_list = line2.xpath('table:table-cell', namespaces=content.nsmap)
    self.assertEqual(len(line2_cell_list), 2)
    line2_cell2 = line2_cell_list[1]
    span_attribute_name = '{%s}number-columns-spanned' % content.nsmap['table']
    line2_cell2_span = line2_cell2.attrib[span_attribute_name]
    self.assertEqual(line2_cell2_span, "2")

    line3 = table_row_list[2]
    line3_cell_list = line3.xpath('table:table-cell', namespaces=content.nsmap)
    self.assertEqual(len(line3_cell_list), 1)
    line3_cell1 = line3_cell_list[0]
    line3_cell1_span = line3_cell1.attrib[span_attribute_name]
    self.assertEqual(line3_cell1_span, "3")

    line5 = table_row_list[4]
    line5_cell_list = line5.xpath('table:table-cell', namespaces=content.nsmap)
    self.assertEqual(len(line5_cell_list), 2)
    line5_cell1 = line5_cell_list[0]
    line5_cell1_span = line5_cell1.attrib[span_attribute_name]
    self.assertEqual(line5_cell1_span, "2")

    self._validate(odf_document)

    # put back the field name
    foo_form.manage_renameObject('listbox4', 'listbox', REQUEST=request)
    # delete the test objects
    test1.manage_delObjects(['foo_3','foo_4','foo_5','foo_6'])

  def _test_03_Frame(self):
    """
    Frame not tested yet
    """
    pass

  def test_04_Iteration(self):
    """
    Iteration using ERP5Report ReportSection test
    """
    # create test target
    custom = self.portal.portal_skins.custom
    erp5form = custom.manage_addProduct['ERP5Form']
    erp5form.addERP5Report(id='FooReport_view', title='Foo Report')
    foo_report_view = custom.FooReport_view
    foo_report_view.report_method = 'FooReport_getReportSectionList'

    erp5form.addERP5Form(id='Foo2_view', title='Foo2')
    foo2_view = custom.Foo2_view
    foo2_view.manage_addField('listbox_report', 'listbox report', 'ListBox')
    listbox = foo2_view.listbox_report

    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getFooList',
      'title,**kw',
r"""
foo_list = context.objectValues(portal_type='Foo Line')
for foo in foo_list:
  foo.setTitle(title)
return foo_list
"""
      )
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'FooReport_getFooList',
      field_selection_name = 'listbox_report_selection',
      field_portal_types = 'Foo Line | Foo Line',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getReportSectionList',
      '',
r"""
from Products.ERP5Form.Report import ReportSection

r1 = ReportSection(path=context.getPhysicalPath(),
                   form_id='Foo2_view',
                   selection_name='listbox_report_selection',
                   selection_params={'title':'foo_04_Iteration_1'})
r2 = ReportSection(path=context.getPhysicalPath(),
                   form_id='Foo2_view',
                   selection_name='listbox_report_selection',
                   selection_params={'title':'foo_04_Iteration_2'})
report_section_list = [r1, r2]
return report_section_list
"""
      )

    # 01. normal case using Frame
    test1 = self.portal.foo_module.test1
    foo_report_printout = test1.FooReport_viewAsPrintout
    foo_report_printout.doSettings(REQUEST=None,
                                   title='',
                                   form_name='FooReport_view',
                                   template='Foo2_getODTStyleSheet')
    self._validate(self.getODFDocumentFromPrintout(foo_report_printout))
    odf_document = foo_report_printout(self.portal.REQUEST)

    #test_output = open("/tmp/test_04_Iteratoin.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("foo_04_Iteration_1") > 0)
    content = etree.XML(content_xml)
    frame_xpath = '//draw:frame[@draw:name="FooReport_getReportSectionList"]'
    frame_list = content.xpath(frame_xpath, namespaces=content.nsmap)
    self.assertEqual(len(frame_list), 1)
    frame1_xpath = '//draw:frame[@draw:name="FooReport_getReportSectionList_1"]'
    frame1_list = content.xpath(frame1_xpath, namespaces=content.nsmap)
    self.assertEqual(len(frame1_list), 1)

    self._validate(odf_document)

    # 02. no report section using frame
    custom.manage_delObjects(['FooReport_getReportSectionList'])
    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getReportSectionList',
      '',
r"""
return []
"""
      )
    odf_document = foo_report_printout(self.portal.REQUEST)
    #test_output = open("/tmp/test_04_02_Iteratoin.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_04_Iteration") > 0)
    content = etree.XML(content_xml)
    frame_xpath = '//draw:frame[@draw:name="FooReport_getReportSectionList"]'
    frame_list = content.xpath(frame_xpath, namespaces=content.nsmap)
    # the frame was removed
    self.assertEqual(len(frame_list), 0)
    self._validate(odf_document)


  def test_04_Iteration_02_Section(self):
    """
    Iteration using ERP5Report ReportSection and ODF Section test
    """
    # create test target
    custom = self.portal.portal_skins.custom
    erp5form = custom.manage_addProduct['ERP5Form']
    erp5form.addERP5Report(id='FooReport_view', title='Foo Report')
    foo_report_view = custom.FooReport_view
    foo_report_view.report_method = 'FooReport_getReportSectionList'

    erp5form.addERP5Form(id='Foo2_view', title='Foo2')
    foo2_view = custom.Foo2_view
    foo2_view.manage_addField('listbox_report', 'listbox report', 'ListBox')
    listbox = foo2_view.listbox_report

    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getFooList',
      'title,**kw',
r"""
foo_list = context.objectValues(portal_type='Foo Line')
for foo in foo_list:
  foo.setTitle(title)
return foo_list
"""
      )
    message = listbox.ListBox_setPropertyList(
      field_list_method = 'FooReport_getFooList',
      field_selection_name = 'listbox_report_selection',
      field_portal_types = 'Foo Line | Foo Line',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)
    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getReportSectionList',
      '',
r"""
from Products.ERP5Form.Report import ReportSection

r1 = ReportSection(path=context.getPhysicalPath(),
                   form_id='Foo2_view',
                   selection_name='listbox_report_selection',
                   selection_params={'title':'foo_04_Iteration_1'})
r2 = ReportSection(path=context.getPhysicalPath(),
                   form_id='Foo2_view',
                   selection_name='listbox_report_selection',
                   selection_params={'title':'foo_04_Iteration_2'})
report_section_list = [r1, r2]
return report_section_list
"""
       )

    # 01. normal case using ODF Section
    test1 = self.portal.foo_module.test1
    foo_report_printout = test1.FooReport_viewAsPrintout
    foo_report_printout.doSettings(REQUEST=None,
                                   title='',
                                   form_name='FooReport_view',
                                   template='Foo3_getODTStyleSheet')
    self._validate(self.getODFDocumentFromPrintout(foo_report_printout))
    odf_document = foo_report_printout(self.portal.REQUEST)

    #test_output = open("/tmp/test_04_Iteratoin_02_Section_01.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("foo_04_Iteration_1") > 0)
    content = etree.XML(content_xml)
    section_xpath = '//text:section[@text:name="FooReport_getReportSectionList"]'
    section_list = content.xpath(section_xpath, namespaces=content.nsmap)
    self.assertEqual(len(section_list), 1)
    section1_xpath = '//text:section[@text:name="FooReport_getReportSectionList_1"]'
    section1_list = content.xpath(section1_xpath, namespaces=content.nsmap)
    self.assertEqual(len(section1_list), 1)

    self._validate(odf_document)

    # 02. no report section and using ODF Section
    custom.manage_delObjects(['FooReport_getReportSectionList'])
    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getReportSectionList',
      '',
r"""
return []
"""
      )
    odf_document = foo_report_printout(self.portal.REQUEST)
    #test_output = open("/tmp/test_04_Iteratoin_02_Section_02.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_04_Iteration") > 0)
    content = etree.XML(content_xml)
    section_xpath = '//text:section[@text:name="FooReport_getReportSectionList"]'
    section_list = content.xpath(section_xpath, namespaces=content.nsmap)
    # the section was removed
    self.assertEqual(len(section_list), 0)
    self._validate(odf_document)


  def test_04_Iteration_03_ReportBox_and_Section(self):
    """
    Iteration using ReportBox and ODF Section test
    """
    # create test target
    custom = self.portal.portal_skins.custom
    erp5form = custom.manage_addProduct['ERP5Form']

    erp5form.addERP5Form(id='Foo_Box_view', title='Foo Box')
    foo_box_view = custom.Foo_Box_view
    foo_box_view.manage_addField('listbox_report', 'listbox report', 'ListBox')
    listbox = foo_box_view.listbox_report

    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getFooList',
      'title,**kw',
r"""
foo_list = context.objectValues(portal_type='Foo Line')
for foo in foo_list:
  foo.setTitle(title)
return foo_list
"""
      )

    message = listbox.ListBox_setPropertyList(
      field_list_method = 'FooReport_getFooList',
      field_selection_name = 'listbox_report_selection',
      field_portal_types = 'Foo Line | Foo Line',
      field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
    self.failUnless('Set Successfully' in message)

    # report box
    foo2_view = erp5form.addERP5Form(id='Foo2_view', title='Foo2 View')
    foo2_view = custom.Foo2_view
    foo2_view.manage_addField('your_report_box1', 'Your Report Box', 'ReportBox')
    your_report_box1 = foo2_view.your_report_box1
    your_report_box1._edit({'report_method':'FooReport_getReportSectionList'})

    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getReportSectionList',
      '',
r"""
from Products.ERP5Form.Report import ReportSection

r1 = ReportSection(path=context.getPhysicalPath(),
                   form_id='Foo_Box_view',
                   selection_name='listbox_report_selection',
                   selection_params={'title':'foo_04_Iteration_1'})
r2 = ReportSection(path=context.getPhysicalPath(),
                   form_id='Foo_Box_view',
                   selection_name='listbox_report_selection',
                   selection_params={'title':'foo_04_Iteration_2'})
report_section_list = [r1, r2]
return report_section_list
"""
       )

    # 01. normal case using ODF Section
    test1 = self.portal.foo_module.test1
    request = self.app.REQUEST
    request['here'] = test1
    foo_report_printout = test1.FooReport_viewAsPrintout
    foo_report_printout.doSettings(REQUEST=request,
                                   title='',
                                   form_name='Foo2_view',
                                   template='Foo4_getODTStyleSheet')
    self._validate(self.getODFDocumentFromPrintout(foo_report_printout))
    odf_document = foo_report_printout(self.portal.REQUEST)

    # test_output = open("/tmp/test_04_Iteratoin_03_Section_01.odf", "w")
    # test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertTrue(content_xml.find("foo_04_Iteration_1") > 0)
    content = etree.XML(content_xml)
    section_xpath = '//text:section[@text:name="your_report_box1"]'
    section_list = content.xpath(section_xpath, namespaces=content.nsmap)
    self.assertEqual(len(section_list), 1)
    section1_xpath = '//text:section[@text:name="your_report_box1_1"]'
    section1_list = content.xpath(section1_xpath, namespaces=content.nsmap)
    self.assertEqual(len(section1_list), 1)

    self._validate(odf_document)

    # 02. no report section and using ODF Section
    custom.manage_delObjects(['FooReport_getReportSectionList'])
    createZODBPythonScript(
      self.portal.portal_skins.custom,
      'FooReport_getReportSectionList',
      '',
r"""
return []
"""
      )
    odf_document = foo_report_printout(self.portal.REQUEST)
    #test_output = open("/tmp/test_04_Iteratoin_02_Section_02.odf", "w")
    #test_output.write(odf_document)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    self.assertFalse(content_xml.find("foo_04_Iteration") > 0)
    content = etree.XML(content_xml)
    section_xpath = '//text:section[@text:name="your_report_box1"]'
    section_list = content.xpath(section_xpath, namespaces=content.nsmap)
    # the section was removed
    self.assertEqual(len(section_list), 0)
    self._validate(odf_document)

  def _test_05_Styles(self):
    """
    styles.xml not tested yet
    """
    pass

  def _test_06_Meta(self):
    """
    meta.xml not supported yet
    """
    pass

  def test_07_Image(self):
    """
    Image mapping not tested yet
    """
    current_dir = os.path.dirname(__file__)
    parent_dir = os.path.dirname(current_dir)
    image_path = os.path.join(parent_dir,
                              'www',
                              'form_printout_icon.png')
    file_data = FileUpload(image_path, 'rb')
    image = self.portal.newContent(portal_type='Image', id='test_image')
    image.edit(file=file_data)

    foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
    foo_form = self.portal.foo_module.test1.Foo_view
    if foo_form._getOb("my_default_image_absolute_url", None) is None:
      foo_form.manage_addField('my_default_image_absolute_url', 'logo', 'ImageField')
    my_default_image_absolute_url = foo_form.my_default_image_absolute_url
    my_default_image_absolute_url.values['default'] = image.absolute_url_path()

    # 01: Normal
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    content = etree.XML(content_xml)
    image_frame_xpath = '//draw:frame[@draw:name="my_default_image_absolute_url"]'
    image_frame_list = content.xpath(image_frame_xpath, namespaces=content.nsmap)
    self.assertTrue(len(image_frame_list) > 0)
    image_frame = image_frame_list[0]
    height = image_frame.attrib['{%s}height' % content.nsmap['svg']]
    self.assertTrue(height in ('0.838cm', '0.3299in'))
    width = image_frame.attrib['{%s}width' % content.nsmap['svg']]
    self.assertTrue(width in ('0.838cm', '0.3299in'))
    self._validate(odf_document)

    # 02: no image data
    my_default_image_absolute_url.values['default'] = ''
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    # confirming the image was removed
    self.assertTrue(content_xml.find('<draw:image xlink:href') < 0)
    self._validate(odf_document)

  def test_08_OOoConversion(self):
    """test ooo conversion"""
    foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
    foo_form = self.portal.foo_module.test1.Foo_view
    if foo_form._getOb("my_test_title", None) is None:
      foo_form.manage_addField('my_test_title', 'test title', 'StringField')
    test_title = foo_form.my_test_title
    test_title.values['default'] = 'ZZZ test here ZZZ'

    self.portal.REQUEST.set('format', 'pdf')
    printout = foo_printout(REQUEST=self.portal.REQUEST)
    #test_output = open("/tmp/test_99_OOoConversion.pdf", "w")
    #test_output.write(printout.data)
    self.assertEqual('application/pdf', guessMime(printout.data))

    self.portal.REQUEST.set('format', 'doc')
    printout = foo_printout(REQUEST=self.portal.REQUEST)
    #test_output = open("/tmp/test_99_OOoConversion.doc", "w")
    #test_output.write(printout.data)
    self.assertEqual('application/msword', guessMime(printout.data))

  def test_09_FieldReplacement(self, validate=False):
    """test field in ODF Documents"""
    foo_printout = self.portal.foo_module.test1.Foo5_viewAsPrintout
    if validate:
      self._validate(self.getODFDocumentFromPrintout(foo_printout))
    foo_form = self.portal.foo_module.test1.Foo_view
    field_name = 'your_checkbox'
    if foo_form._getOb(field_name, None) is None:
      foo_form.manage_addField(field_name, 'CheckBox', 'CheckBoxField')
    checkbox = getattr(foo_form, field_name)

    checkbox.values['default'] = 1
    odf_document = foo_printout(self.portal.REQUEST)
    if validate:
      self._validate(odf_document)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    document_tree = etree.XML(content_xml)
    node = document_tree.xpath('//form:checkbox[@form:name = "%s"]' % field_name, namespaces=document_tree.nsmap)[0]
    self.assertTrue(node.get('{%s}current-state' % document_tree.nsmap['form']))

    checkbox.values['default'] = 0
    odf_document = foo_printout(self.portal.REQUEST)
    if validate:
      self._validate(odf_document)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    document_tree = etree.XML(content_xml)
    node = document_tree.xpath('//form:checkbox[@form:name = "%s"]' % field_name, namespaces=document_tree.nsmap)[0]
    self.assertFalse(node.get('{%s}current-state' % document_tree.nsmap['form']))

  @skip('Disable validation because OOo does not produce compliant'\
        ' xml, and RelaxNG status is still draft')
  def test_09_FieldReplacementWithValidation(self):
    """
    """
    return self.test_09_FieldReplacement(validate=True)

  def test_field_replacement_with_variable(self):
    """test variables replacement in ODT documents.
    """
    document = self.portal.foo_module.test1
    document.setTitle(None)
    foo_form = document.Foo_view
    field_configuration_list = (
      ('my_string', 'StringField', 'ZZZ test here ZZZ'),
      ('my_figure', 'IntegerField', 221),
      ('my_float', 'FloatField', 23.43535),
      ('my_date', 'DateTimeField', DateTime('2010-12-6 23:24:15.234 GMT+6')),
      ('my_boolean', 'CheckBoxField', False),
      )
    for field_configuration in field_configuration_list:
      field_id, klass, value = field_configuration
      if foo_form._getOb(field_id, None) is not None:
        foo_form._delObject(field_id)
      foo_form.manage_addField(field_id, field_id, klass)
      field = foo_form[field_id]
      field.values['default'] = value
    foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
    # Use template with variable defines
    foo_printout.template = 'Foo_getVariableODTStyleSheet'
    odf_document = foo_printout(self.portal.REQUEST)
    self.assertTrue(odf_document is not None)
    builder = OOoBuilder(odf_document)
    content_xml = builder.extract("content.xml")
    content_tree = etree.fromstring(content_xml)
    nsmap = content_tree.nsmap
    for field_configuration in field_configuration_list:
      field_id, klass, value = field_configuration
      xpath = '//text:variable-set[@text:name = "%s"]' % field_id
      node_list = content_tree.xpath(xpath, namespaces=nsmap)
      self.assertEquals(1, len(node_list))
      node = node_list[0]
      if klass == 'StringField':
        self.assertEquals(node.get('{%s}value-type' % nsmap['office']),
                          'string')
        self.assertEquals(node.text, value)
      elif klass in ('IntegerField', 'FloatField'):
        self.assertEquals(node.get('{%s}value-type' % nsmap['office']),
                          'float')
        self.assertEquals(node.get('{%s}value' % nsmap['office']), str(value))
      elif klass == 'DateTimeField':
        self.assertEquals(node.get('{%s}value-type' % nsmap['office']), 'date')
        self.assertEquals(node.text, value.strftime('%d/%m/%Y %H:%M:%S'))
      elif klass == 'CheckBoxField':
        self.assertEquals(node.get('{%s}value-type' % nsmap['office']),
                          'boolean')
        self.assertEquals(node.get('{%s}boolean-value' % nsmap['office']),
                          'false')
        self.assertEquals(node.text, 'FALSE')
      else:
        raise NotImplementedError

def test_suite():
  suite = unittest.TestSuite()
  suite.addTest(unittest.makeSuite(TestFormPrintoutAsODT))
  return suite
