test_do_undo.py :  » Database » PyTables » tables-2.1.2 » tables » tests » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Database » PyTables 
PyTables » tables 2.1.2 » tables » tests » test_do_undo.py
import sys
import unittest
import os
import tempfile
import warnings

import tables
from tables import *
from tables.node import NotLoggedMixin
from tables.path import joinPath

from tables.tests import common

# To delete the internal attributes automagically
unittest.TestCase.tearDown = common.cleanup


class BasicTestCase(unittest.TestCase):

    """Test for basic Undo/Redo operations."""

    _reopen = False
    """Whether to reopen the file at certain points."""

    def _doReopen(self):
        if self._reopen:
            self.fileh.close()
            self.fileh = openFile(self.file, mode='r+')


    def setUp(self):
        # Create an HDF5 file
        #self.file = "/tmp/test.h5"
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                  "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)

    def test00_simple(self):
        """Checking simple do/undo"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00_simple..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray', [3,4], "Another array")
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/otherarray" not in self.fileh)
        assert self.fileh._curaction == 0
        assert self.fileh._curmark == 0
        # Redo the operation
        self._doReopen()
        self.fileh.redo()
        if common.verbose:
            print "Object tree after redo:", self.fileh
        # Check that otherarray has come back to life in a sane state
        self.assert_("/otherarray" in self.fileh)
        assert self.fileh.root.otherarray.read() == [3,4]
        assert self.fileh.root.otherarray.title == "Another array"
        assert self.fileh._curaction == 1
        assert self.fileh._curmark == 0

    def test01_twice(self):
        """Checking do/undo (twice operations intertwined)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01_twice..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray', [3,4], "Another array")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operations
        self._doReopen()
        self.fileh.undo()
        self.assert_("/otherarray" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        assert self.fileh._curaction == 0
        assert self.fileh._curmark == 0
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/otherarray" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray.title == "Another array"
        assert self.fileh.root.otherarray2.title == "Another array 2"
        assert self.fileh._curaction == 2
        assert self.fileh._curmark == 0

    def test02_twice2(self):
        """Checking twice ops and two marks"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02_twice2..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray', [3,4], "Another array")
        # Put a mark
        self._doReopen()
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        assert self.fileh._curaction == 3
        assert self.fileh._curmark == 1
        # Unwind just one mark
        self.fileh.undo()
        self.assert_("/otherarray" in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        assert self.fileh._curaction == 2
        assert self.fileh._curmark == 1
        # Unwind another mark
        self.fileh.undo()
        assert self.fileh._curaction == 0
        assert self.fileh._curmark == 0
        self.assert_("/otherarray" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        # Redo until the next mark
        self.fileh.redo()
        self.assert_("/otherarray" in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self._doReopen()
        assert self.fileh._curaction == 2
        assert self.fileh._curmark == 1
        # Redo until the end
        self.fileh.redo()
        self.assert_("/otherarray" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray.title == "Another array"
        assert self.fileh.root.otherarray2.title == "Another array 2"
        assert self.fileh._curaction == 3
        assert self.fileh._curmark == 1

    def test03_6times3marks(self):
        """Checking with six ops and three marks"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03_6times3marks..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Put a mark
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        # Put a mark
        self._doReopen()
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray5', [7,8], "Another array 5")
        self.fileh.createArray('/', 'otherarray6', [8,9], "Another array 6")
        # Unwind just one mark
        self.fileh.undo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" in self.fileh)
        self.assert_("/otherarray5" not in self.fileh)
        self.assert_("/otherarray6" not in self.fileh)
        # Unwind another mark
        self.fileh.undo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" not in self.fileh)
        self.assert_("/otherarray6" not in self.fileh)
        # Unwind all marks
        self.fileh.undo()
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" not in self.fileh)
        self.assert_("/otherarray6" not in self.fileh)
        # Redo until the next mark
        self._doReopen()
        self.fileh.redo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" not in self.fileh)
        self.assert_("/otherarray6" not in self.fileh)
        # Redo until the next mark
        self.fileh.redo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" in self.fileh)
        self.assert_("/otherarray5" not in self.fileh)
        self.assert_("/otherarray6" not in self.fileh)
        # Redo until the end
        self.fileh.redo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" in self.fileh)
        self.assert_("/otherarray5" in self.fileh)
        self.assert_("/otherarray6" in self.fileh)
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray3.read() == [5,6]
        assert self.fileh.root.otherarray4.read() == [6,7]
        assert self.fileh.root.otherarray5.read() == [7,8]
        assert self.fileh.root.otherarray6.read() == [8,9]
        assert self.fileh.root.otherarray1.title == "Another array 1"
        assert self.fileh.root.otherarray2.title == "Another array 2"
        assert self.fileh.root.otherarray3.title == "Another array 3"
        assert self.fileh.root.otherarray4.title == "Another array 4"
        assert self.fileh.root.otherarray5.title == "Another array 5"
        assert self.fileh.root.otherarray6.title == "Another array 6"

    def test04_6times3marksro(self):
        """Checking with six operations, three marks and do/undo in random order"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test04_6times3marksro..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Put a mark
        self.fileh.mark()
        self._doReopen()
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        # Unwind the previous mark
        self.fileh.undo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Put a mark in the middle of stack
        if common.verbose:
            print "All nodes:", self.fileh.walkNodes()
        self.fileh.mark()
        self._doReopen()
        self.fileh.createArray('/', 'otherarray5', [7,8], "Another array 5")
        self.fileh.createArray('/', 'otherarray6', [8,9], "Another array 6")
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" in self.fileh)
        self.assert_("/otherarray6" in self.fileh)
        # Unwind previous mark
        self.fileh.undo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" not in self.fileh)
        self.assert_("/otherarray6" not in self.fileh)
        # Redo until the last mark
        self.fileh.redo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" in self.fileh)
        self.assert_("/otherarray6" in self.fileh)
        # Redo until the next mark (non-existent, so no action)
        self._doReopen()
        self.fileh.redo()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        self.assert_("/otherarray5" in self.fileh)
        self.assert_("/otherarray6" in self.fileh)
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray5.read() == [7,8]
        assert self.fileh.root.otherarray6.read() == [8,9]
        assert self.fileh.root.otherarray1.title == "Another array 1"
        assert self.fileh.root.otherarray2.title == "Another array 2"
        assert self.fileh.root.otherarray5.title == "Another array 5"
        assert self.fileh.root.otherarray6.title == "Another array 6"

    def test05_destructive(self):
        """Checking with a destructive action during undo"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test05_destructive..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        # Put a mark
        self.fileh.mark()
        self._doReopen()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operation
        self.fileh.undo()
        # Do the destructive operation
        self._doReopen()
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        # Check objects
        self.assert_("/otherarray1" in self.fileh)
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray1.title == "Another array 1"
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        assert self.fileh.root.otherarray3.read() == [5,6]
        assert self.fileh.root.otherarray3.title == "Another array 3"

    def test05b_destructive(self):
        """Checking with a destructive action during undo (II)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test05b_destructive..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        # Put a mark
        self._doReopen()
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operation
        self.fileh.undo()
        # Do the destructive operation
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        # Put a mark
        self._doReopen()
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        self.assert_("/otherarray4" in self.fileh)
        # Now undo the past operation
        self.fileh.undo()
        # Check objects
        self.assert_("/otherarray1" in self.fileh)
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray1.title == "Another array 1"
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        assert self.fileh.root.otherarray3.read() == [5,6]
        assert self.fileh.root.otherarray3.title == "Another array 3"
        self.assert_("/otherarray4" not in self.fileh)

    def test05c_destructive(self):
        """Checking with a destructive action during undo (III)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test05c_destructive..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        # Put a mark
        self.fileh.mark()
        self._doReopen()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operation
        self.fileh.undo()
        # Do the destructive operation
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        # Put a mark
        self.fileh.mark()
        self._doReopen()
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        self.assert_("/otherarray4" in self.fileh)
        # Now unwind twice
        self.fileh.undo()
        self._doReopen()
        self.fileh.undo()
        # Check objects
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)

    def test05d_destructive(self):
        """Checking with a destructive action during undo (IV)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test05d_destructive..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        # Put a mark
        self._doReopen()
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operation
        self.fileh.undo()
        # Do the destructive operation
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        # Put a mark
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        self.assert_("/otherarray4" in self.fileh)
        # Now, go to the first mark
        self._doReopen()
        self.fileh.undo(0)
        # Check objects
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)

    def test05e_destructive(self):
        """Checking with a destructive action during undo (V)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test05e_destructive..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        # Put a mark
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operation
        self.fileh.undo()
        self._doReopen()
        # Do the destructive operation
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        # Now, unwind the actions
        self.fileh.undo(0)
        self._doReopen()
        # Check objects
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)

    def test05f_destructive(self):
        "Checking with a destructive creation of existing node during undo"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test05f_destructive..." % self.__class__.__name__

        self.fileh.enableUndo()
        self.fileh.createArray('/', 'newarray', [1])
        self.fileh.undo()
        self._doReopen()
        self.assert_('/newarray' not in self.fileh)
        newarr = self.fileh.createArray('/', 'newarray', [1])
        self.fileh.undo()
        self.assert_('/newarray' not in self.fileh)
        self._doReopen()
        self.fileh.redo()
        self.assert_('/newarray' in self.fileh)
        if not self._reopen:
            self.assert_(self.fileh.root.newarray is newarr)

    def test06_totalunwind(self):
        """Checking do/undo (total unwind)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test06_totalunwind..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray', [3,4], "Another array")
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operations
        self._doReopen()
        self.fileh.undo(0)
        self.assert_("/otherarray" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)

    def test07_totalrewind(self):
        """Checking do/undo (total rewind)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test07_totalunwind..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray', [3,4], "Another array")
        self.fileh.mark()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operations
        self.fileh.undo(0)
        # Redo all the operations
        self._doReopen()
        self.fileh.redo(-1)
        # Check that objects has come back to life in a sane state
        self.assert_("/otherarray" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray.title == "Another array"
        assert self.fileh.root.otherarray2.title == "Another array 2"


    def test08_marknames(self):
        """Checking mark names"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test08_marknames..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        self.fileh.mark("first")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        self.fileh.mark("second")
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        self.fileh.mark("third")
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        # Now go to mark "first"
        self.fileh.undo("first")
        self._doReopen()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to mark "third"
        self.fileh.redo("third")
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Now go to mark "second"
        self.fileh.undo("second")
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to the end
        self._doReopen()
        self.fileh.redo(-1)
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" in self.fileh)
        # Check that objects has come back to life in a sane state
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray3.read() == [5,6]
        assert self.fileh.root.otherarray4.read() == [6,7]

    def test08_initialmark(self):
        """Checking initial mark"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test08_initialmark..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        initmid = self.fileh.getCurrentMark()
        # Create a new array
        self.fileh.createArray('/', 'otherarray', [3,4], "Another array")
        self.fileh.mark()
        self._doReopen()
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        # Now undo the past operations
        self.fileh.undo(initmid)
        self.assert_("/otherarray" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        # Redo all the operations
        self.fileh.redo(-1)
        self._doReopen()
        # Check that objects has come back to life in a sane state
        self.assert_("/otherarray" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray.title == "Another array"
        assert self.fileh.root.otherarray2.title == "Another array 2"


    def test09_marknames(self):
        """Checking mark names (wrong direction)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test09_marknames..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        self.fileh.mark("first")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        self.fileh.mark("second")
        self._doReopen()
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        self.fileh.mark("third")
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        # Now go to mark "first"
        self.fileh.undo("first")
        # Try to undo up to mark "third"
        try:
            self.fileh.undo("third")
        except UndoRedoError:
            if common.verbose:
                (type, value, traceback) = sys.exc_info()
                print "\nGreat!, the next UndoRedoError was catched!"
                print value
        else:
            self.fail("expected an UndoRedoError")
        # Now go to mark "third"
        self.fileh.redo("third")
        self._doReopen()
        # Try to redo up to mark "second"
        try:
            self.fileh.redo("second")
        except UndoRedoError:
            if common.verbose:
                (type, value, traceback) = sys.exc_info()
                print "\nGreat!, the next UndoRedoError was catched!"
                print value
        else:
            self.fail("expected an UndoRedoError")
        # Final checks
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)

    def test10_goto(self):
        """Checking mark names (goto)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test10_goto..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        self._doReopen()
        self.fileh.mark("first")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        self.fileh.mark("second")
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        self._doReopen()
        self.fileh.mark("third")
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        # Now go to mark "first"
        self.fileh.goto("first")
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to mark "third"
        self.fileh.goto("third")
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Now go to mark "second"
        self._doReopen()
        self.fileh.goto("second")
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to the end
        self.fileh.goto(-1)
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" in self.fileh)
        # Check that objects has come back to life in a sane state
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray3.read() == [5,6]
        assert self.fileh.root.otherarray4.read() == [6,7]

    def test10_gotoint(self):
        """Checking mark sequential ids (goto)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test10_gotoint..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [3,4], "Another array 1")
        self.fileh.mark("first")
        self.fileh.createArray('/', 'otherarray2', [4,5], "Another array 2")
        self.fileh.mark("second")
        self._doReopen()
        self.fileh.createArray('/', 'otherarray3', [5,6], "Another array 3")
        self.fileh.mark("third")
        self.fileh.createArray('/', 'otherarray4', [6,7], "Another array 4")
        # Now go to mark "first"
        self.fileh.goto(1)
        self._doReopen()
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to beginning
        self.fileh.goto(0)
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to mark "third"
        self._doReopen()
        self.fileh.goto(3)
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Now go to mark "second"
        self.fileh.goto(2)
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        self.assert_("/otherarray4" not in self.fileh)
        # Go to the end
        self._doReopen()
        self.fileh.goto(-1)
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        self.assert_("/otherarray4" in self.fileh)
        # Check that objects has come back to life in a sane state
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray1.read() == [3,4]
        assert self.fileh.root.otherarray2.read() == [4,5]
        assert self.fileh.root.otherarray3.read() == [5,6]
        assert self.fileh.root.otherarray4.read() == [6,7]

    def test11_contiguous(self):
        "Creating contiguous marks"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test11_contiguous..." % self.__class__.__name__

        self.fileh.enableUndo()
        m1 = self.fileh.mark()
        m2 = self.fileh.mark()
        self.assertNotEqual(m1, m2)
        self._doReopen()
        self.fileh.undo(m1)
        self.assertEqual(self.fileh.getCurrentMark(), m1)
        self.fileh.redo(m2)
        self.assertEqual(self.fileh.getCurrentMark(), m2)
        self.fileh.goto(m1)
        self.assertEqual(self.fileh.getCurrentMark(), m1)
        self.fileh.goto(m2)
        self.assertEqual(self.fileh.getCurrentMark(), m2)
        self.fileh.goto(-1)
        self._doReopen()
        self.assertEqual(self.fileh.getCurrentMark(), m2)
        self.fileh.goto(0)
        self.assertEqual(self.fileh.getCurrentMark(), 0)

    def test12_keepMark(self):
        "Ensuring the mark is kept after an UNDO operation"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test12_keepMark..." % self.__class__.__name__

        self.fileh.enableUndo()
        arr1 = self.fileh.createArray('/', 'newarray1', [1])

        mid = self.fileh.mark()
        self._doReopen()
        self.fileh.undo()
        # We should have moved to the initial mark.
        self.assertEqual(self.fileh.getCurrentMark(), 0)
        # So /newarray1 should not be there.
        self.assert_('/newarray1' not in self.fileh)

    def test13_severalEnableDisable(self):
        "Checking that successive enable/disable Undo works"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test13_severalEnableDisable..." % self.__class__.__name__

        self.fileh.enableUndo()
        arr1 = self.fileh.createArray('/', 'newarray1', [1])
        self.fileh.undo()
        self._doReopen()
        # We should have moved to 'mid' mark, not the initial mark.
        self.assertEqual(self.fileh.getCurrentMark(), 0)
        # So /newarray1 should still be there.
        self.assert_('/newarray1' not in self.fileh)
        # Close this do/undo session
        self.fileh.disableUndo()
        # Do something
        arr2 = self.fileh.createArray('/', 'newarray2', [1])
        # Enable again do/undo
        self.fileh.enableUndo()
        arr3 = self.fileh.createArray('/', 'newarray3', [1])
        mid = self.fileh.mark()
        arr4 = self.fileh.createArray('/', 'newarray4', [1])
        self.fileh.undo()
        # We should have moved to 'mid' mark, not the initial mark.
        self.assertEqual(self.fileh.getCurrentMark(), mid)
        # So /newarray2 and /newarray3 should still be there.
        self.assert_('/newarray1' not in self.fileh)
        self.assert_('/newarray2' in self.fileh)
        self.assert_('/newarray3' in self.fileh)
        self.assert_('/newarray4' not in self.fileh)
        # Close this do/undo session
        self._doReopen()
        self.fileh.disableUndo()
        # Enable again do/undo
        self.fileh.enableUndo()
        arr3 = self.fileh.createArray('/', 'newarray1', [1])
        arr4 = self.fileh.createArray('/', 'newarray4', [1])
        # So /newarray2 and /newarray3 should still be there.
        self.assert_('/newarray1' in self.fileh)
        self.assert_('/newarray2' in self.fileh)
        self.assert_('/newarray3' in self.fileh)
        self.assert_('/newarray4' in self.fileh)
        self.fileh.undo()
        self._doReopen()
        self.assert_('/newarray1' not in self.fileh)
        self.assert_('/newarray2' in self.fileh)
        self.assert_('/newarray3' in self.fileh)
        self.assert_('/newarray4' not in self.fileh)
        # Close this do/undo session
        self.fileh.disableUndo()


class PersistenceTestCase(BasicTestCase):

    """Test for basic Undo/Redo operations with persistence."""

    _reopen = True


class createArrayTestCase(unittest.TestCase):
    "Test for createArray operations"

    def setUp(self):
        # Create an HDF5 file
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00(self):
        """Checking one action"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [1,2], "Another array 1")
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/otherarray1" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/otherarray1" in self.fileh)
        assert self.fileh.root.otherarray1.title == "Another array 1"
        assert self.fileh.root.otherarray1.read() == [1,2]


    def test01(self):
        """Checking two actions"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [1,2], "Another array 1")
        self.fileh.createArray('/', 'otherarray2', [2,3], "Another array 2")
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        assert self.fileh.root.otherarray1.title == "Another array 1"
        assert self.fileh.root.otherarray2.title == "Another array 2"
        assert self.fileh.root.otherarray1.read() == [1,2]
        assert self.fileh.root.otherarray2.read() == [2,3]


    def test02(self):
        """Checking three actions"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [1,2], "Another array 1")
        self.fileh.createArray('/', 'otherarray2', [2,3], "Another array 2")
        self.fileh.createArray('/', 'otherarray3', [3,4], "Another array 3")
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/otherarray2" not in self.fileh)
        self.assert_("/otherarray3" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/otherarray2" in self.fileh)
        self.assert_("/otherarray3" in self.fileh)
        assert self.fileh.root.otherarray1.title == "Another array 1"
        assert self.fileh.root.otherarray2.title == "Another array 2"
        assert self.fileh.root.otherarray3.title == "Another array 3"
        assert self.fileh.root.otherarray1.read() == [1,2]
        assert self.fileh.root.otherarray2.read() == [2,3]
        assert self.fileh.root.otherarray3.read() == [3,4]

    def test03(self):
        """Checking three actions in different depth levels"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.createArray('/', 'otherarray1', [1,2], "Another array 1")
        self.fileh.createArray('/agroup', 'otherarray2', [2,3], "Another array 2")
        self.fileh.createArray('/agroup/agroup3', 'otherarray3', [3,4], "Another array 3")
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/otherarray1" not in self.fileh)
        self.assert_("/agroup/otherarray2" not in self.fileh)
        self.assert_("/agroup/agroup3/otherarray3" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/otherarray1" in self.fileh)
        self.assert_("/agroup/otherarray2" in self.fileh)
        self.assert_("/agroup/agroup3/otherarray3" in self.fileh)
        assert self.fileh.root.otherarray1.title == "Another array 1"
        assert self.fileh.root.agroup.otherarray2.title == "Another array 2"
        assert self.fileh.root.agroup.agroup3.otherarray3.title == "Another array 3"
        assert self.fileh.root.otherarray1.read() == [1,2]
        assert self.fileh.root.agroup.otherarray2.read() == [2,3]
        assert self.fileh.root.agroup.agroup3.otherarray3.read() == [3,4]


class createGroupTestCase(unittest.TestCase):
    "Test for createGroup operations"

    def setUp(self):
        # Create an HDF5 file
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00(self):
        """Checking one action"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new group
        self.fileh.createGroup('/', 'othergroup1', "Another group 1")
        # Now undo the past operation
        self.fileh.undo()
        # Check that othergroup1 does not exist in the object tree
        self.assert_("/othergroup1" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that othergroup1 has come back to life in a sane state
        self.assert_("/othergroup1" in self.fileh)
        assert self.fileh.root.othergroup1._v_title == "Another group 1"


    def test01(self):
        """Checking two actions"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new group
        self.fileh.createGroup('/', 'othergroup1', "Another group 1")
        self.fileh.createGroup('/', 'othergroup2', "Another group 2")
        # Now undo the past operation
        self.fileh.undo()
        # Check that othergroup does not exist in the object tree
        self.assert_("/othergroup1" not in self.fileh)
        self.assert_("/othergroup2" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that othergroup* has come back to life in a sane state
        self.assert_("/othergroup1" in self.fileh)
        self.assert_("/othergroup2" in self.fileh)
        assert self.fileh.root.othergroup1._v_title == "Another group 1"
        assert self.fileh.root.othergroup2._v_title == "Another group 2"


    def test02(self):
        """Checking three actions"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new group
        self.fileh.createGroup('/', 'othergroup1', "Another group 1")
        self.fileh.createGroup('/', 'othergroup2', "Another group 2")
        self.fileh.createGroup('/', 'othergroup3', "Another group 3")
        # Now undo the past operation
        self.fileh.undo()
        # Check that othergroup* does not exist in the object tree
        self.assert_("/othergroup1" not in self.fileh)
        self.assert_("/othergroup2" not in self.fileh)
        self.assert_("/othergroup3" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that othergroup* has come back to life in a sane state
        self.assert_("/othergroup1" in self.fileh)
        self.assert_("/othergroup2" in self.fileh)
        self.assert_("/othergroup3" in self.fileh)
        assert self.fileh.root.othergroup1._v_title == "Another group 1"
        assert self.fileh.root.othergroup2._v_title == "Another group 2"
        assert self.fileh.root.othergroup3._v_title == "Another group 3"


    def test03(self):
        """Checking three actions in different depth levels"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new group
        self.fileh.createGroup('/', 'othergroup1', "Another group 1")
        self.fileh.createGroup('/othergroup1', 'othergroup2', "Another group 2")
        self.fileh.createGroup('/othergroup1/othergroup2', 'othergroup3', "Another group 3")
        # Now undo the past operation
        self.fileh.undo()
        # Check that othergroup* does not exist in the object tree
        self.assert_("/othergroup1" not in self.fileh)
        self.assert_("/othergroup1/othergroup2" not in self.fileh)
        self.assert_("/othergroup1/othergroup2/othergroup3" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that othergroup* has come back to life in a sane state
        self.assert_("/othergroup1" in self.fileh)
        self.assert_("/othergroup1/othergroup2" in self.fileh)
        self.assert_("/othergroup1/othergroup2/othergroup3" in self.fileh)
        assert self.fileh.root.othergroup1._v_title == "Another group 1"
        assert self.fileh.root.othergroup1.othergroup2._v_title == "Another group 2"
        assert self.fileh.root.othergroup1.othergroup2.othergroup3._v_title == "Another group 3"


minRowIndex = 10
def populateTable(where, name):
    "Create a table under where with name name"

    class Indexed(IsDescription):
        var1 = StringCol(itemsize=4, dflt="", pos=1)
        var2 = BoolCol(dflt=0, pos=2)
        var3 = IntCol(dflt=0, pos=3)
        var4 = FloatCol(dflt=0, pos=4)

    nrows = minRowIndex
    table = where._v_file.createTable(where, name, Indexed, "Indexed",
                                      None, nrows)
    for i in range(nrows):
        table.row['var1'] = str(i)
        # table.row['var2'] = i > 2
        table.row['var2'] = i % 2
        table.row['var3'] = i
        table.row['var4'] = float(nrows - i - 1)
        table.row.append()
    table.flush()

    if tables.is_pro:
        # Index all entries:
        indexrows = table.cols.var1.createIndex()
        indexrows = table.cols.var2.createIndex()
        indexrows = table.cols.var3.createIndex()
        # Do not index the var4 column
        #indexrows = table.cols.var4.createIndex()
    if common.verbose:
        print "Number of written rows:", nrows
        if tables.is_pro:
            print "Number of indexed rows:", table.cols.var1.index.nelements
            print "Number of indexed rows(2):", indexrows

class renameNodeTestCase(unittest.TestCase):
    "Test for renameNode operations"

    def setUp(self):
        # Create an HDF5 file
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")
        # Create a table in root
        table = populateTable(self.fileh.root, 'table')

    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)

    def test00(self):
        """Checking renameNode (over Groups without children)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.renameNode('/agroup2', 'agroup3')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does not exist in the object tree
        self.assert_("/agroup2" in self.fileh)
        self.assert_("/agroup3" not in self.fileh)
        assert self.fileh.root.agroup2._v_title == "Group title 2"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/agroup2" not in self.fileh)
        self.assert_("/agroup3" in self.fileh)
        assert self.fileh.root.agroup3._v_title == "Group title 2"

    def test01(self):
        """Checking renameNode (over Groups with children)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.renameNode('/agroup', 'agroup3')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does not exist in the object tree
        self.assert_("/agroup" in self.fileh)
        self.assert_("/agroup3" not in self.fileh)
        # Check that children are reachable
        self.assert_("/agroup/anarray1" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        self.assert_("/agroup/agroup3" in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/agroup" not in self.fileh)
        self.assert_("/agroup3" in self.fileh)
        assert self.fileh.root.agroup3._v_title == "Group title"
        # Check that children are reachable
        self.assert_("/agroup3/anarray1" in self.fileh)
        self.assert_("/agroup3/anarray2" in self.fileh)
        self.assert_("/agroup3/agroup3" in self.fileh)

    def test01b(self):
        """Checking renameNode (over Groups with children 2)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01b..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.renameNode('/agroup', 'agroup3')
        self.fileh.renameNode('/agroup3', 'agroup4')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does not exist in the object tree
        self.assert_("/agroup" in self.fileh)
        self.assert_("/agroup4" not in self.fileh)
        # Check that children are reachable
        self.assert_("/agroup/anarray1" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        self.assert_("/agroup/agroup3" in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/agroup" not in self.fileh)
        self.assert_("/agroup4" in self.fileh)
        assert self.fileh.root.agroup4._v_title == "Group title"
        # Check that children are reachable
        self.assert_("/agroup4/anarray1" in self.fileh)
        self.assert_("/agroup4/anarray2" in self.fileh)
        self.assert_("/agroup4/agroup3" in self.fileh)

    def test02(self):
        """Checking renameNode (over Leaves)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.renameNode('/anarray', 'anarray2')
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/anarray" in self.fileh)
        self.assert_("/anarray2" not in self.fileh)
        assert self.fileh.root.anarray.title == "Array title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/anarray" not in self.fileh)
        self.assert_("/anarray2" in self.fileh)
        assert self.fileh.root.anarray2.title == "Array title"

    def test03(self):
        """Checking renameNode (over Tables)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.renameNode('/table', 'table2')
        # Now undo the past operation
        self.fileh.undo()
        # Check that table2 does not exist in the object tree
        self.assert_("/table" in self.fileh)
        table = self.fileh.root.table
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var4.index is None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
        self.assert_("/table2" not in self.fileh)
        assert self.fileh.root.table.title == "Indexed"
        # Redo the operation
        self.fileh.redo()
        # Check that table2 has come back to life in a sane state
        self.assert_("/table" not in self.fileh)
        self.assert_("/table2" in self.fileh)
        assert self.fileh.root.table2.title == "Indexed"
        table = self.fileh.root.table2
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
            assert table.cols.var4.index is None


class moveNodeTestCase(unittest.TestCase):
    "Tests for moveNode operations"

    def setUp(self):
        # Create an HDF5 file
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")
        # Create a table in root
        table = populateTable(self.fileh.root, 'table')

    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00(self):
        """Checking moveNode (over Leaf)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.moveNode('/anarray', '/agroup/agroup3')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does not exist in the object tree
        self.assert_("/anarray" in self.fileh)
        self.assert_("/agroup/agroup3/anarray" not in self.fileh)
        assert self.fileh.root.anarray.title == "Array title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/anarray" not in self.fileh)
        self.assert_("/agroup/agroup3/anarray" in self.fileh)
        assert self.fileh.root.agroup.agroup3.anarray.title == "Array title"

    def test01(self):
        """Checking moveNode (over Groups with children)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.moveNode('/agroup', '/agroup2', 'agroup3')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does not exist in the object tree
        self.assert_("/agroup" in self.fileh)
        self.assert_("/agroup2/agroup3" not in self.fileh)
        # Check that children are reachable
        self.assert_("/agroup/anarray1" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        self.assert_("/agroup/agroup3" in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/agroup" not in self.fileh)
        self.assert_("/agroup2/agroup3" in self.fileh)
        assert self.fileh.root.agroup2.agroup3._v_title == "Group title"
        # Check that children are reachable
        self.assert_("/agroup2/agroup3/anarray1" in self.fileh)
        self.assert_("/agroup2/agroup3/anarray2" in self.fileh)
        self.assert_("/agroup2/agroup3/agroup3" in self.fileh)

    def test01b(self):
        """Checking moveNode (over Groups with children 2)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01b..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.moveNode('/agroup', '/', 'agroup3')
        self.fileh.moveNode('/agroup3', '/agroup2', 'agroup4')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does not exist in the object tree
        self.assert_("/agroup" in self.fileh)
        self.assert_("/agroup2/agroup4" not in self.fileh)
        # Check that children are reachable
        self.assert_("/agroup/anarray1" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        self.assert_("/agroup/agroup3" in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/agroup" not in self.fileh)
        self.assert_("/agroup2/agroup4" in self.fileh)
        assert self.fileh.root.agroup2.agroup4._v_title == "Group title"
        # Check that children are reachable
        self.assert_("/agroup2/agroup4/anarray1" in self.fileh)
        self.assert_("/agroup2/agroup4/anarray2" in self.fileh)
        self.assert_("/agroup2/agroup4/agroup3" in self.fileh)

    def test02(self):
        """Checking moveNode (over Leaves)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.moveNode('/anarray', '/agroup2', 'anarray2')
        # Now undo the past operation
        self.fileh.undo()
        # Check that otherarray does not exist in the object tree
        self.assert_("/anarray" in self.fileh)
        self.assert_("/agroup2/anarray2" not in self.fileh)
        assert self.fileh.root.anarray.title == "Array title"
        # Redo the operation
        self.fileh.redo()
        # Check that otherarray has come back to life in a sane state
        self.assert_("/anarray" not in self.fileh)
        self.assert_("/agroup2/anarray2" in self.fileh)
        assert self.fileh.root.agroup2.anarray2.title == "Array title"

    def test03(self):
        """Checking moveNode (over Tables)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.moveNode('/table', '/agroup2', 'table2')
        # Now undo the past operation
        self.fileh.undo()
        # Check that table2 does not exist in the object tree
        self.assert_("/table" in self.fileh)
        self.assert_("/agroup2/table2" not in self.fileh)
        table = self.fileh.root.table
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var4.index is None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
        assert self.fileh.root.table.title == "Indexed"
        # Redo the operation
        self.fileh.redo()
        # Check that table2 has come back to life in a sane state
        self.assert_("/table" not in self.fileh)
        self.assert_("/agroup2/table2" in self.fileh)
        assert self.fileh.root.agroup2.table2.title == "Indexed"
        table = self.fileh.root.agroup2.table2
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
            assert table.cols.var4.index is None


class removeNodeTestCase(unittest.TestCase):
    "Test for removeNode operations"

    def setUp(self):
        # Create an HDF5 file
        #self.file = "/tmp/test.h5"
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")
        # Create a table in root
        table = populateTable(self.fileh.root, 'table')


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00(self):
        """Checking removeNode (over Leaf)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Delete an existing array
        self.fileh.removeNode('/anarray')
        # Now undo the past operation
        self.fileh.undo()
        # Check that it does exist in the object tree
        self.assert_("/anarray" in self.fileh)
        assert self.fileh.root.anarray.title == "Array title"
        # Redo the operation
        self.fileh.redo()
        # Check that array has gone again
        self.assert_("/anarray" not in self.fileh)

    def test00b(self):
        """Checking removeNode (over several Leaves)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00b..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Delete a couple of arrays
        self.fileh.removeNode('/anarray')
        self.fileh.removeNode('/agroup/anarray2')
        # Now undo the past operation
        self.fileh.undo()
        # Check that arrays has come into life
        self.assert_("/anarray" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        assert self.fileh.root.anarray.title == "Array title"
        assert self.fileh.root.agroup.anarray2.title == "Array title 2"
        # Redo the operation
        self.fileh.redo()
        # Check that arrays has disappeared again
        self.assert_("/anarray" not in self.fileh)
        self.assert_("/agroup/anarray2" not in self.fileh)

    def test00c(self):
        """Checking removeNode (over Tables)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00c..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Create a new array
        self.fileh.removeNode('/table')
        # Now undo the past operation
        self.fileh.undo()
        # Check that table2 does not exist in the object tree
        self.assert_("/table" in self.fileh)
        table = self.fileh.root.table
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var4.index is None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
        assert self.fileh.root.table.title == "Indexed"
        # Redo the operation
        self.fileh.redo()
        # Check that table2 has come back to life in a sane state
        self.assert_("/table" not in self.fileh)

    def test01(self):
        """Checking removeNode (over Groups with children)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Delete a group recursively
        self.fileh.removeNode('/agroup', recursive=1)
        # Now undo the past operation
        self.fileh.undo()
        # Check that parent and children has come into life in a sane state
        self.assert_("/agroup" in self.fileh)
        self.assert_("/agroup/anarray1" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        self.assert_("/agroup/agroup3" in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        # Redo the operation
        self.fileh.redo()
        # Check that parent and children are not reachable
        self.assert_("/agroup" not in self.fileh)
        self.assert_("/agroup/anarray1" not in self.fileh)
        self.assert_("/agroup/anarray2" not in self.fileh)
        self.assert_("/agroup/agroup3" not in self.fileh)

    def test01b(self):
        """Checking removeNode (over Groups with children 2)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01b..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # Remove a couple of groups
        self.fileh.removeNode('/agroup', recursive=1)
        self.fileh.removeNode('/agroup2')
        # Now undo the past operation
        self.fileh.undo()
        # Check that they does exist in the object tree
        self.assert_("/agroup" in self.fileh)
        self.assert_("/agroup2" in self.fileh)
        # Check that children are reachable
        self.assert_("/agroup/anarray1" in self.fileh)
        self.assert_("/agroup/anarray2" in self.fileh)
        self.assert_("/agroup/agroup3" in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        # Redo the operation
        self.fileh.redo()
        # Check that groups does not exist again
        self.assert_("/agroup" not in self.fileh)
        self.assert_("/agroup2" not in self.fileh)
        # Check that children are not reachable
        self.assert_("/agroup/anarray1" not in self.fileh)
        self.assert_("/agroup/anarray2" not in self.fileh)
        self.assert_("/agroup/agroup3" not in self.fileh)


class copyNodeTestCase(unittest.TestCase):
    "Tests for copyNode and copyChildren operations"

    def setUp(self):
        # Create an HDF5 file
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")
        # Create a table in root
        table = populateTable(self.fileh.root, 'table')


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00_copyLeaf(self):
        """Checking copyNode (over Leaves)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00_copyLeaf..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # /anarray => /agroup/agroup3/
        newNode = self.fileh.copyNode('/anarray', '/agroup/agroup3')

        # Undo the copy.
        self.fileh.undo()
        # Check that the copied node does not exist in the object tree.
        self.assert_('/agroup/agroup3/anarray' not in self.fileh)

        # Redo the copy.
        self.fileh.redo()
        # Check that the copied node exists again in the object tree.
        self.assert_('/agroup/agroup3/anarray' in self.fileh)
        self.assert_(self.fileh.root.agroup.agroup3.anarray is newNode)


    def test00b_copyTable(self):
        """Checking copyNode (over Tables)"""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00b_copyTable..." % self.__class__.__name__

        # open the do/undo
        self.fileh.enableUndo()
        # /table => /agroup/agroup3/
        warnings.filterwarnings("ignore", category=UserWarning)
        table = self.fileh.copyNode(
            '/table', '/agroup/agroup3', propindexes=True)
        warnings.filterwarnings("default", category=UserWarning)
        self.assert_("/agroup/agroup3/table" in self.fileh)

        table = self.fileh.root.agroup.agroup3.table
        assert table.title == "Indexed"
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
            assert table.cols.var4.index is None
        # Now undo the past operation
        self.fileh.undo()
        table = self.fileh.root.table
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var4.index is None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
        # Check that the copied node does not exist in the object tree.
        self.assert_("/agroup/agroup3/table" not in self.fileh)
        # Redo the operation
        self.fileh.redo()
        # Check that table has come back to life in a sane state
        self.assert_("/table" in self.fileh)
        self.assert_("/agroup/agroup3/table" in self.fileh)
        table = self.fileh.root.agroup.agroup3.table
        assert table.title == "Indexed"
        if tables.is_pro:
            assert table.cols.var1.index is not None
            assert table.cols.var2.index is not None
            assert table.cols.var3.index is not None
            assert table.cols.var1.index.nelements == minRowIndex
            assert table.cols.var2.index.nelements == minRowIndex
            assert table.cols.var3.index.nelements == minRowIndex
            assert table.cols.var4.index is None

    def test01_copyGroup(self):
        "Copying a group (recursively)."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01_copyGroup..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # /agroup => /acopy
        newNode = self.fileh.copyNode(
            '/agroup', newname = 'acopy', recursive = True)

        # Undo the copy.
        self.fileh.undo()
        # Check that the copied node does not exist in the object tree.
        self.assert_('/acopy' not in self.fileh)
        self.assert_('/acopy/anarray1' not in self.fileh)
        self.assert_('/acopy/anarray2' not in self.fileh)
        self.assert_('/acopy/agroup3' not in self.fileh)

        # Redo the copy.
        self.fileh.redo()
        # Check that the copied node exists again in the object tree.
        self.assert_('/acopy' in self.fileh)
        self.assert_('/acopy/anarray1' in self.fileh)
        self.assert_('/acopy/anarray2' in self.fileh)
        self.assert_('/acopy/agroup3' in self.fileh)
        self.assert_(self.fileh.root.acopy is newNode)


    def test02_copyLeafOverwrite(self):
        "Copying a leaf, overwriting destination."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02_copyLeafOverwrite..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # /anarray => /agroup/agroup
        oldNode = self.fileh.root.agroup
        newNode = self.fileh.copyNode(
            '/anarray', newname = 'agroup', overwrite = True)

        # Undo the copy.
        self.fileh.undo()
        # Check that the copied node does not exist in the object tree.
        # Check that the overwritten node exists again in the object tree.
        self.assert_(self.fileh.root.agroup is oldNode)

        # Redo the copy.
        self.fileh.redo()
        # Check that the copied node exists again in the object tree.
        # Check that the overwritten node does not exist in the object tree.
        self.assert_(self.fileh.root.agroup is newNode)


    def test03_copyChildren(self):
        "Copying the children of a group."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03_copyChildren..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # /agroup/* => /agroup/
        self.fileh.copyChildren('/agroup', '/agroup2', recursive = True)

        # Undo the copy.
        self.fileh.undo()
        # Check that the copied nodes do not exist in the object tree.
        self.assert_('/agroup2/anarray1' not in self.fileh)
        self.assert_('/agroup2/anarray2' not in self.fileh)
        self.assert_('/agroup2/agroup3' not in self.fileh)

        # Redo the copy.
        self.fileh.redo()
        # Check that the copied nodes exist again in the object tree.
        self.assert_('/agroup2/anarray1' in self.fileh)
        self.assert_('/agroup2/anarray2' in self.fileh)
        self.assert_('/agroup2/agroup3' in self.fileh)


class ComplexTestCase(unittest.TestCase):
    "Tests for a mix of all operations"

    def setUp(self):
        # Create an HDF5 file
        #self.file = "/tmp/test.h5"
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(self.file, mode = "w", title="File title")
        fileh = self.fileh
        root = fileh.root
        # Create an array
        fileh.createArray(root, 'array', [1,2],
                          title = "Title example")

        # Create another array object
        array = fileh.createArray(root, 'anarray',
                                  [1], "Array title")
        # Create a group object
        group = fileh.createGroup(root, 'agroup',
                                  "Group title")
        # Create a couple of objects there
        array1 = fileh.createArray(group, 'anarray1',
                                   [2], "Array title 1")
        array2 = fileh.createArray(group, 'anarray2',
                                   [2], "Array title 2")
        # Create a lonely group in first level
        group2 = fileh.createGroup(root, 'agroup2',
                                   "Group title 2")
        # Create a new group in the second level
        group3 = fileh.createGroup(group, 'agroup3',
                                   "Group title 3")


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00(self):
        """Mix of createArray, createGroup, renameNone, moveNode, removeNode,
           copyNode and copyChildren."""

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # Create an array
        self.fileh.createArray(self.fileh.root, 'anarray3',
                               [1], "Array title 3")
        # Create a group
        array2 = self.fileh.createGroup(self.fileh.root, 'agroup3',
                                        "Group title 3")
        # /anarray => /agroup/agroup3/
        newNode = self.fileh.copyNode('/anarray3', '/agroup/agroup3')
        newNode = self.fileh.copyChildren('/agroup', '/agroup3', recursive=1)
        # rename anarray
        array4 = self.fileh.renameNode('/anarray', 'anarray4')
        # Move anarray
        newNode = self.fileh.copyNode('/anarray3', '/agroup')
        # Remove anarray4
        self.fileh.removeNode('/anarray4')
        # Undo the actions
        self.fileh.undo()
        self.assert_('/anarray4' not in self.fileh)
        self.assert_('/anarray3' not in self.fileh)
        self.assert_('/agroup/agroup3/anarray3' not in self.fileh)
        self.assert_('/agroup3' not in self.fileh)
        self.assert_('/anarray4' not in self.fileh)
        self.assert_('/anarray' in self.fileh)

        # Redo the actions
        self.fileh.redo()
        # Check that the copied node exists again in the object tree.
        self.assert_('/agroup/agroup3/anarray3' in self.fileh)
        self.assert_('/agroup/anarray3' in self.fileh)
        self.assert_('/agroup3/agroup3/anarray3' in self.fileh)
        self.assert_('/agroup3/anarray3' not in self.fileh)
        self.assert_(self.fileh.root.agroup.anarray3 is newNode)
        self.assert_('/anarray' not in self.fileh)
        self.assert_('/anarray4' not in self.fileh)

    def test01(self):
        "Test with multiple generations (Leaf case)"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # remove /anarray
        self.fileh.removeNode('/anarray')
        # Create an array in the same place
        self.fileh.createArray(self.fileh.root, 'anarray',
                                        [2], "Array title 2")
        # remove the array again
        self.fileh.removeNode('/anarray')
        # Create an array
        array2 = self.fileh.createArray(self.fileh.root, 'anarray',
                                        [3], "Array title 3")
        # remove the array again
        self.fileh.removeNode('/anarray')
        # Create an array
        array2 = self.fileh.createArray(self.fileh.root, 'anarray',
                                        [4], "Array title 4")
        # Undo the actions
        self.fileh.undo()
        # Check that /anarray is in the correct state before redoing
        assert self.fileh.root.anarray.title == "Array title"
        assert self.fileh.root.anarray[:] == [1]
        # Redo the actions
        self.fileh.redo()
        assert self.fileh.root.anarray.title == "Array title 4"
        assert self.fileh.root.anarray[:] == [4]

    def test02(self):
        "Test with multiple generations (Group case)"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # remove /agroup
        self.fileh.removeNode('/agroup2')
        # Create a group in the same place
        self.fileh.createGroup(self.fileh.root, 'agroup2', "Group title 22")
        # remove the group
        self.fileh.removeNode('/agroup2')
        # Create a group
        self.fileh.createGroup(self.fileh.root, 'agroup2', "Group title 3")
        # remove the group
        self.fileh.removeNode('/agroup2')
        # Create a group
        self.fileh.createGroup(self.fileh.root, 'agroup2', "Group title 4")
        # Create a child group
        self.fileh.createGroup(self.fileh.root.agroup2, 'agroup5',
                               "Group title 5")
        # Undo the actions
        self.fileh.undo()
        # Check that /agroup is in the state before enabling do/undo
        assert self.fileh.root.agroup2._v_title == "Group title 2"
        self.assert_('/agroup2' in self.fileh)
        # Redo the actions
        self.fileh.redo()
        assert self.fileh.root.agroup2._v_title == "Group title 4"
        assert self.fileh.root.agroup2.agroup5._v_title == "Group title 5"

    def test03(self):
        "Test with multiple generations (Group case, recursive remove)"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # remove /agroup
        self.fileh.removeNode('/agroup', recursive=1)
        # Create a group in the same place
        self.fileh.createGroup(self.fileh.root, 'agroup', "Group title 2")
        # remove the group
        self.fileh.removeNode('/agroup')
        # Create a group
        self.fileh.createGroup(self.fileh.root, 'agroup', "Group title 3")
        # remove the group
        self.fileh.removeNode('/agroup')
        # Create a group
        self.fileh.createGroup(self.fileh.root, 'agroup', "Group title 4")
        # Create a child group
        self.fileh.createGroup(self.fileh.root.agroup, 'agroup5',
                               "Group title 5")
        # Undo the actions
        self.fileh.undo()
        # Check that /agroup is in the state before enabling do/undo
        self.assert_('/agroup' in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title"
        self.assert_('/agroup/anarray1' in self.fileh)
        self.assert_('/agroup/anarray2' in self.fileh)
        self.assert_('/agroup/agroup3' in self.fileh)
        self.assert_('/agroup/agroup5' not in self.fileh)
        # Redo the actions
        self.fileh.redo()
        self.assert_('/agroup' in self.fileh)
        assert self.fileh.root.agroup._v_title == "Group title 4"
        self.assert_('/agroup/agroup5' in self.fileh)
        assert self.fileh.root.agroup.agroup5._v_title == "Group title 5"

    def test03b(self):
        "Test with multiple generations (Group case, recursive remove, case 2)"

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03b..." % self.__class__.__name__

        # Enable undo/redo.
        self.fileh.enableUndo()
        # Create a new group with a child
        self.fileh.createGroup(self.fileh.root, 'agroup3', "Group title 3")
        self.fileh.createGroup(self.fileh.root.agroup3, 'agroup4',
                               "Group title 4")
        # remove /agroup3
        self.fileh.removeNode('/agroup3', recursive=1)
        # Create a group in the same place
        self.fileh.createGroup(self.fileh.root, 'agroup3', "Group title 4")
        # Undo the actions
        self.fileh.undo()
        # Check that /agroup is in the state before enabling do/undo
        self.assert_('/agroup3' not in self.fileh)
        # Redo the actions
        self.fileh.redo()
        assert self.fileh.root.agroup3._v_title == "Group title 4"
        self.assert_('/agroup3' in self.fileh)
        self.assert_('/agroup/agroup4' not in self.fileh)



class AttributesTestCase(unittest.TestCase):
    "Tests for operation on attributes"

    def setUp(self):
        # Create an HDF5 file
        self.file = tempfile.mktemp(".h5")
        self.fileh = openFile(
            self.file, mode = "w", title = "Attribute operations")

        # Create an array.
        array = self.fileh.createArray('/', 'array', [1,2])

        # Set some attributes on it.
        attrs = array.attrs
        attrs.attr_1 = 10
        attrs.attr_2 = 20
        attrs.attr_3 = 30


    def tearDown(self):
        # Remove the temporary file
        self.fileh.close()
        os.remove(self.file)
        common.cleanup(self)


    def test00_setAttr(self):
        "Setting a nonexistent attribute."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test00_setAttr..." % self.__class__.__name__

        array = self.fileh.root.array
        attrs = array.attrs

        self.fileh.enableUndo()
        setattr(attrs, 'attr_0', 0)
        self.assert_('attr_0' in attrs)
        self.assertEqual(attrs.attr_0, 0)
        self.fileh.undo()
        self.assert_('attr_0' not in attrs)
        self.fileh.redo()
        self.assert_('attr_0' in attrs)
        self.assertEqual(attrs.attr_0, 0)


    def test01_setAttrExisting(self):
        "Setting an existing attribute."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test01_setAttrExisting..." % self.__class__.__name__

        array = self.fileh.root.array
        attrs = array.attrs

        self.fileh.enableUndo()
        setattr(attrs, 'attr_1', 11)
        self.assert_('attr_1' in attrs)
        self.assertEqual(attrs.attr_1, 11)
        self.fileh.undo()
        self.assert_('attr_1' in attrs)
        self.assertEqual(attrs.attr_1, 10)
        self.fileh.redo()
        self.assert_('attr_1' in attrs)
        self.assertEqual(attrs.attr_1, 11)


    def test02_delAttr(self):
        "Removing an attribute."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test02_delAttr..." % self.__class__.__name__

        array = self.fileh.root.array
        attrs = array.attrs

        self.fileh.enableUndo()
        delattr(attrs, 'attr_1')
        self.assert_('attr_1' not in attrs)
        self.fileh.undo()
        self.assert_('attr_1' in attrs)
        self.assertEqual(attrs.attr_1, 10)
        self.fileh.redo()
        self.assert_('attr_1' not in attrs)


    def test03_copyNodeAttrs(self):
        "Copying an attribute set."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test03_copyNodeAttrs..." % self.__class__.__name__

        rattrs = self.fileh.root._v_attrs
        rattrs.attr_0 = 0
        rattrs.attr_1 = 100

        array = self.fileh.root.array
        attrs = array.attrs

        self.fileh.enableUndo()
        attrs._f_copy(self.fileh.root)
        self.assertEqual(rattrs.attr_0, 0)
        self.assertEqual(rattrs.attr_1, 10)
        self.assertEqual(rattrs.attr_2, 20)
        self.assertEqual(rattrs.attr_3, 30)
        self.fileh.undo()
        self.assertEqual(rattrs.attr_0, 0)
        self.assertEqual(rattrs.attr_1, 100)
        self.assert_('attr_2' not in rattrs)
        self.assert_('attr_3' not in rattrs)
        self.fileh.redo()
        self.assertEqual(rattrs.attr_0, 0)
        self.assertEqual(rattrs.attr_1, 10)
        self.assertEqual(rattrs.attr_2, 20)
        self.assertEqual(rattrs.attr_3, 30)


    def test04_replaceNode(self):
        "Replacing a node with a rewritten attribute."

        if common.verbose:
            print '\n', '-=' * 30
            print "Running %s.test04_replaceNode..." % self.__class__.__name__

        array = self.fileh.root.array
        attrs = array.attrs

        self.fileh.enableUndo()
        attrs.attr_1 = 11
        self.fileh.removeNode('/array')
        arr = self.fileh.createArray('/', 'array', [1])
        arr.attrs.attr_1 = 12
        self.fileh.undo()
        self.assert_('attr_1' in self.fileh.root.array.attrs)
        self.assertEqual(self.fileh.root.array.attrs.attr_1, 10)
        self.fileh.redo()
        self.assert_('attr_1' in self.fileh.root.array.attrs)
        self.assertEqual(self.fileh.root.array.attrs.attr_1, 12)


class NotLoggedTestCase(common.TempFileMixin, common.PyTablesTestCase):

    """Test not logged nodes."""

    class NotLoggedArray(NotLoggedMixin, Array):
        pass


    def test00_hierarchy(self):
        """Performing hierarchy operations on a not logged node."""

        self.h5file.createGroup('/', 'tgroup')
        self.h5file.enableUndo()

        # Node creation is not undone.
        arr = self.NotLoggedArray( self.h5file.root, 'test',
                                   [1], self._getMethodName() )
        self.h5file.undo()
        self.assert_('/test' in self.h5file)

        # Node movement is not undone.
        arr.move('/tgroup')
        self.h5file.undo()
        self.assert_('/tgroup/test' in self.h5file)

        # Node removal is not undone.
        arr.remove()
        self.h5file.undo()
        self.assert_('/tgroup/test' not in self.h5file)


    def test01_attributes(self):
        """Performing attribute operations on a not logged node."""

        arr = self.NotLoggedArray( self.h5file.root, 'test',
                                   [1], self._getMethodName() )
        self.h5file.enableUndo()

        # Attribute creation is not undone.
        arr._v_attrs.foo = 'bar'
        self.h5file.undo()
        self.assert_(arr._v_attrs.foo == 'bar')

        # Attribute change is not undone.
        arr._v_attrs.foo = 'baz'
        self.h5file.undo()
        self.assert_(arr._v_attrs.foo == 'baz')

        # Attribute removal is not undone.
        del arr._v_attrs.foo
        self.h5file.undo()
        self.assertRaises(AttributeError, getattr, arr._v_attrs, 'foo')


class CreateParentsTestCase(common.TempFileMixin, common.PyTablesTestCase):

    """Test the ``createparents`` flag."""

    def setUp(self):
        super(CreateParentsTestCase, self).setUp()
        g1 = self.h5file.createGroup('/', 'g1')
        g2 = self.h5file.createGroup(g1, 'g2')

    def existing(self, paths):
        """Return a set of the existing paths in `paths`."""
        return frozenset(path for path in paths if path in self.h5file)

    def basetest(self, doit, pre, post):
        pre()
        self.h5file.enableUndo()

        paths =  ['/g1', '/g1/g2', '/g1/g2/g3', '/g1/g2/g3/g4']
        for newpath in paths:
            before = self.existing(paths)
            doit(newpath)
            after = self.existing(paths)
            self.assert_(after.issuperset(before))

            self.h5file.undo()
            post(newpath)
            after = self.existing(paths)
            self.assertEqual(after, before)

    def test00_create(self):
        """Test creating a node."""
        def pre():
            pass
        def doit(newpath):
            self.h5file.createArray(newpath, 'array', [1], createparents=True)
            self.assert_(joinPath(newpath, 'array') in self.h5file)
        def post(newpath):
            self.assert_(joinPath(newpath, 'array') not in self.h5file)
        self.basetest(doit, pre, post)

    def test01_move(self):
        """Test moving a node."""
        def pre():
            self.h5file.createArray('/', 'array', [1])
        def doit(newpath):
            self.h5file.moveNode('/array', newpath, createparents=True)
            self.assert_('/array' not in self.h5file)
            self.assert_(joinPath(newpath, 'array') in self.h5file)
        def post(newpath):
            self.assert_('/array' in self.h5file)
            self.assert_(joinPath(newpath, 'array') not in self.h5file)
        self.basetest(doit, pre, post)

    def test02_copy(self):
        """Test copying a node."""
        def pre():
            self.h5file.createArray('/', 'array', [1])
        def doit(newpath):
            self.h5file.copyNode('/array', newpath, createparents=True)
            self.assert_(joinPath(newpath, 'array') in self.h5file)
        def post(newpath):
            self.assert_(joinPath(newpath, 'array') not in self.h5file)
        self.basetest(doit, pre, post)

    def test03_copyChildren(self):
        """Test copying the children of a group."""
        def pre():
            g = self.h5file.createGroup('/', 'group')
            self.h5file.createArray(g, 'array1', [1])
            self.h5file.createArray(g, 'array2', [1])
        def doit(newpath):
            self.h5file.copyChildren('/group', newpath, createparents=True)
            self.assert_(joinPath(newpath, 'array1') in self.h5file)
            self.assert_(joinPath(newpath, 'array2') in self.h5file)
        def post(newpath):
            self.assert_(joinPath(newpath, 'array1') not in self.h5file)
            self.assert_(joinPath(newpath, 'array2') not in self.h5file)
        self.basetest(doit, pre, post)


def suite():
    theSuite = unittest.TestSuite()
    niter = 1
    #common.heavy = 1  # uncomment this only for testing purposes

    for n in range(niter):
        theSuite.addTest(unittest.makeSuite(BasicTestCase))
        theSuite.addTest(unittest.makeSuite(PersistenceTestCase))
        theSuite.addTest(unittest.makeSuite(createArrayTestCase))
        theSuite.addTest(unittest.makeSuite(createGroupTestCase))
        theSuite.addTest(unittest.makeSuite(renameNodeTestCase))
        theSuite.addTest(unittest.makeSuite(moveNodeTestCase))
        theSuite.addTest(unittest.makeSuite(removeNodeTestCase))
        theSuite.addTest(unittest.makeSuite(copyNodeTestCase))
        theSuite.addTest(unittest.makeSuite(AttributesTestCase))
        theSuite.addTest(unittest.makeSuite(ComplexTestCase))
        theSuite.addTest(unittest.makeSuite(NotLoggedTestCase))
        theSuite.addTest(unittest.makeSuite(CreateParentsTestCase))
    if common.heavy:
        pass

    return theSuite


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

## Local Variables:
## mode: python
## End:
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.