#! /usr/bin/env python
# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
import unittest
from org.libreoffice.unotest import UnoInProcess


class XModifiable2(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls._uno = UnoInProcess()
        cls._uno.setUp()

    @classmethod
    def tearDownClass(cls):
        cls._uno.tearDown()

    def test_XModifiable2(self):
        # initialization
        xDoc = self._uno.openEmptyWriterDoc()

        # perform unit test
        self.assertTrue(xDoc.isSetModifiedEnabled())

        self.assertTrue(xDoc.disableSetModified())
        self.assertFalse(xDoc.isSetModifiedEnabled())

        self.assertFalse(xDoc.enableSetModified())
        self.assertTrue(xDoc.isSetModifiedEnabled())

        # clean up
        xDoc.close(True)

    def test_XModifiable2_Double(self):
        # initialization
        xDoc = self._uno.openEmptyWriterDoc()

        # perform unit test
        self.assertTrue(xDoc.isSetModifiedEnabled())

        # try to disable
        # Expected return value:
        #   `TRUE` the changing of the modified state was disabled
        self.assertTrue(xDoc.disableSetModified())
        self.assertFalse(xDoc.isSetModifiedEnabled())

        # try to disable twice
        # Expected return value:
        #   `FALSE` the changing of the modified state was already disabled
        self.assertFalse(xDoc.disableSetModified())
        self.assertFalse(xDoc.isSetModifiedEnabled())

        # try to disable third time
        # Expected return value:
        #   `FALSE` the changing of the modified state was already disabled
        #   i.e. the same as in previous call
        self.assertFalse(xDoc.disableSetModified())
        self.assertFalse(xDoc.isSetModifiedEnabled())

        # try to enable
        # Expected return value:
        #   `FALSE` the changing of the modified state was enabled
        self.assertFalse(xDoc.enableSetModified())
        self.assertTrue(xDoc.isSetModifiedEnabled())

        # try to enable twice
        # Expected return value:
        #   `TRUE` the changing of the modified state was already enabled
        self.assertTrue(xDoc.enableSetModified())
        self.assertTrue(xDoc.isSetModifiedEnabled())

        # try to enable third time
        # Expected return value:
        #   `TRUE` the changing of the modified state was already enabled
        #   i.e. the same as in previous call
        self.assertTrue(xDoc.enableSetModified())
        self.assertTrue(xDoc.isSetModifiedEnabled())

        # clean up
        xDoc.close(True)

    def test_XModifiable2_setModified(self):
        # initialization
        xDoc = self._uno.openEmptyWriterDoc()

        # perform unit test
        # try to set modified flag when modification enabled
        self.assertTrue(xDoc.isSetModifiedEnabled())

        self.assertFalse(xDoc.isModified())
        xDoc.setModified(True)
        self.assertTrue(xDoc.isModified())

        xDoc.setModified(False)
        self.assertFalse(xDoc.isModified())

        # try to set modified flag when modification disabled
        self.assertTrue(xDoc.disableSetModified())
        self.assertFalse(xDoc.isSetModifiedEnabled())

        self.assertFalse(xDoc.isModified())
        xDoc.setModified(True)
        self.assertFalse(xDoc.isModified())

        self.assertFalse(xDoc.enableSetModified())
        self.assertTrue(xDoc.isSetModifiedEnabled())

        # document is still not modified
        self.assertFalse(xDoc.isModified())

        # try to set modified flag when modification enabled
        # and when we have changed the modification possibility
        self.assertTrue(xDoc.isSetModifiedEnabled())

        self.assertFalse(xDoc.isModified())
        xDoc.setModified(True)
        self.assertTrue(xDoc.isModified())

        xDoc.setModified(False)
        self.assertFalse(xDoc.isModified())

        # clean up
        xDoc.close(True)

    def test_setModified_ByContent(self):
        # initialization
        xDoc = self._uno.openEmptyWriterDoc()

        # perform unit test:
        #        set modified flag using text editing
        #        when modification of the flag is enabled
        self.assertTrue(xDoc.isSetModifiedEnabled())
        self.assertFalse(xDoc.isModified())

        cursor = xDoc.Text.createTextCursor()
        xDoc.Text.insertString(cursor, "The first paragraph", 0)

        self.assertTrue(xDoc.isSetModifiedEnabled())
        self.assertTrue(xDoc.isModified())

        # clean up
        xDoc.close(True)

    def test_setModified_ByContent_Blocked(self):
        # initialization
        xDoc = self._uno.openEmptyWriterDoc()

        # perform unit test:
        #       it is unable to set modified flag using text editing
        #       when modification of the flag was disabled
        self.assertTrue(xDoc.disableSetModified())
        self.assertFalse(xDoc.isSetModifiedEnabled())
        self.assertFalse(xDoc.isModified())

        cursor = xDoc.Text.createTextCursor()
        xDoc.Text.insertString(cursor, "The first paragraph", 0)

        self.assertFalse(xDoc.isSetModifiedEnabled())
        self.assertFalse(xDoc.isModified())

        # clean up
        xDoc.close(True)

    def test_WriteProtectedDocument(self):
        # initialization
        xDoc = self._uno.openTemplateFromTDOC('WriteProtected.odt')

        # perform unit test:
        #       it is able to set modified flag using text editing despite
        #       ODT file was marked to be opened as read-only
        self.assertTrue(xDoc.isSetModifiedEnabled())
        self.assertFalse(xDoc.isModified())

        cursor = xDoc.Text.createTextCursor()
        xDoc.Text.insertString(cursor, "The first paragraph", 0)

        self.assertTrue(xDoc.isSetModifiedEnabled())
        self.assertTrue(xDoc.isModified())

        # clean up
        xDoc.close(True)


if __name__ == '__main__':
    unittest.main()

# vim: set shiftwidth=4 softtabstop=4 expandtab:
