Пример #1
0
def construct_chief_controller(datapath, temp_dir_for_excludes=None):
    settings = FakeSettings(temp_dir_for_excludes)
    library_manager = LibraryManager(':memory:')
    library_manager.create_database()
    chief = ChiefController(Namespace(settings), settings, library_manager)
    chief.load_data(datapath, NullObserver())
    return chief
 def __init__(self, namespace, settings=None, library_manager=None):
     self.removed_files = []
     self.serialized_files = []
     library_manager = library_manager or LibraryManager(':memory:')
     if not library_manager:
         library_manager.create_database()
     ChiefController.__init__(self, namespace, settings, library_manager)
Пример #3
0
def construct_chief_controller(datapath, temp_dir_for_excludes=None):
    settings = FakeSettings(temp_dir_for_excludes)
    library_manager = LibraryManager(':memory:')
    library_manager.create_database()
    chief = ChiefController(Namespace(settings), settings, library_manager)
    chief.load_data(datapath, NullObserver())
    return chief
Пример #4
0
 def __init__(self, namespace, settings=None, library_manager=None):
     self.removed_files = []
     self.serialized_files = []
     library_manager = library_manager or LibraryManager(':memory:')
     if not library_manager:
         library_manager.create_database()
     ChiefController.__init__(self, namespace, settings, library_manager)
Пример #5
0
 def _load(self, testcasefile):
     ns = Namespace(FakeSettings())
     library_manager = LibraryManager(':memory:')
     library_manager.create_database()
     chief = ChiefController(ns, settings=ns._settings, library_manager=library_manager)
     chief.load_datafile(testcasefile,
                         MessageRecordingLoadObserver())
     return ns, chief._controller.data, library_manager
Пример #6
0
 def _load(self, testcasefile):
     ns = Namespace(FakeSettings())
     library_manager = LibraryManager(':memory:')
     library_manager.create_database()
     chief = ChiefController(ns,
                             settings=ns._settings,
                             library_manager=library_manager)
     chief.load_datafile(testcasefile, MessageRecordingLoadObserver())
     return ns, chief._controller.data, library_manager
Пример #7
0
 def __init__(self, random, path):
     print 'librarydatabase.initialize_database()'
     print librarydatabase.initialize_database()
     print 'settings = RideSettings()'
     print 'chief = ChiefController(Namespace(settings=settings), settings=settings)'
     settings = RideSettings()
     self._chief = ChiefController(Namespace(settings=settings),
                                   settings=settings)
     self._path = path
     self._suite = None
     self._test = None
     self._keyword = None
     self._random = random
     self._skip = False
Пример #8
0
 def __init__(self, random, path):
     print 'chief = ChiefController(Namespace())'
     self._chief = ChiefController(Namespace())
     self._path = path
     self._suite = None
     self._test = None
     self._keyword = None
     self._random = random
     self._skip = False
Пример #9
0
 def __init__(self, random, path):
     print 'settings = RideSettings()'
     print 'chief = ChiefController(Namespace(settings=settings), settings=settings)'
     settings = RideSettings()
     self._chief = ChiefController(Namespace(settings=settings), settings=settings)
     self._path = path
     self._suite = None
     self._test = None
     self._keyword = None
     self._random = random
     self._skip = False
Пример #10
0
 def __init__(self, random, path):
     print "librarydatabase.initialize_database()"
     print librarydatabase.initialize_database()
     print "settings = RideSettings()"
     print "chief = ChiefController(Namespace(settings=settings), settings=settings)"
     settings = RideSettings()
     self._chief = ChiefController(Namespace(settings=settings), settings=settings)
     self._path = path
     self._suite = None
     self._test = None
     self._keyword = None
     self._random = random
     self._skip = False
 def _create_data(self, resource_name, resource_import):
     res_path = os.path.abspath(resource_name)
     tcf = TestCaseFile(source=os.path.abspath('test.txt'))
     tcf.setting_table.add_resource(resource_import)
     tcf.variable_table.add('${dirname}', os.path.abspath('.').replace('\\', '\\\\'))
     tcf.variable_table.add('${path}', os.path.abspath(resource_name).replace('\\', '\\\\'))
     library_manager = LibraryManager(':memory:')
     library_manager.create_database()
     self.chef = ChiefController(Namespace(FakeSettings()), FakeSettings(), library_manager)
     self.chef._controller = TestCaseFileController(tcf, self.chef)
     res = ResourceFile(source=res_path)
     self.res_controller = \
         self.chef._resource_file_controller_factory.create(res)
     self.chef._namespace._resource_factory.cache[os.path.normcase(res_path)] = res
Пример #12
0
class RIDE(object):
    def __init__(self, random, path):
        print 'librarydatabase.initialize_database()'
        print librarydatabase.initialize_database()
        print 'settings = RideSettings()'
        print 'chief = ChiefController(Namespace(settings=settings), settings=settings)'
        settings = RideSettings()
        self._chief = ChiefController(Namespace(settings=settings),
                                      settings=settings)
        self._path = path
        self._suite = None
        self._test = None
        self._keyword = None
        self._random = random
        self._skip = False

    def _skip_until_notified(self):
        self._skip = True

    def _do_not_skip(self):
        self._skip = False

    def open_test_dir(self):
        if self._skip:
            return
        self._open(os.path.join(self._path, 'testdir'))
        print 'suite = chief.data.children[0]'
        self._suite = self._chief.data.children[0]
        print 'test = list(t for t in suite.tests)[0]'
        self._test = list(t for t in self._suite.tests)[0]
        print 'keyword = list(k for k in suite.keywords)[0]'
        self._keyword = list(k for k in self._suite.keywords)[0]

    def open_suite_file(self):
        if self._skip:
            return
        self._open(os.path.join(self._path, 'testdir', 'Suite.txt'))
        print 'suite = chief.data'
        self._suite = self._chief.data
        print 'test = list(t for t in suite.tests)[0]'
        self._test = list(t for t in self._suite.tests)[0]
        print 'keyword = list(k for k in suite.keywords)[0]'
        self._keyword = list(k for k in self._suite.keywords)[0]

    def _open_resource_file(self):
        self._open(os.path.join(self._path, 'testdir', 'resources',
                                'resu.txt'))
        self._suite = None
        self._test = None
        self._keyword = None

    def _open(self, path):
        print 'chief.load_data("%s", NullObserver())' % path
        self._chief.load_data(path, NullObserver())

    def _create_suite(self):
        filename = os.path.join(self._path,
                                'path_to_foo%s.txt' % str(self._rand()))
        print 'suite = chief.data.execute(AddSuite(NewDatafile("%s")))' % filename
        self._suite = self._chief.data.execute(AddTestCaseFile(filename))

    def create_test(self):
        if self._skip:
            self._rand()
            return
        testname = 'foobar' + str(self._rand())
        print 'test = suite.execute(AddTestCase("%s"))' % testname
        self._test = self._suite.execute(AddTestCase(testname))

    def change_test_order(self):
        self._change_order([t.data for t in self._suite.tests],
                           self._suite.tests)

    def _change_order(self, items, controller):
        command = MoveUp if self._rand() > 0.5 else MoveDown
        r = self._rand()
        if self._skip:
            return
        items = list(items)
        if items:
            i = int(r * (len(items)))
            print '%s.execute(%s(items[%d]))' % (controller.__class__.__name__,
                                                 command.__name__, i)
            controller.execute(command(items[i]))

    def _rand(self):
        return self._random.random()

    def _rand_row(self):
        return self._random.randint(0, 100)

    def _rand_col(self):
        return self._random.randint(0, 30)

    def create_keyword(self):
        if self._skip:
            self._rand()
            return
        keyword_name = 'kwFoobar' + str(self._rand())
        print 'keyword = suite.execute(AddKeyword("%s"))' % keyword_name
        self._keyword = self._suite.execute(AddKeyword(keyword_name))

    def change_keyword_order(self):
        pass

    def add_variable(self):
        if self._skip:
            self._rand()
            self._rand()
            return
        command = AddVariable('${var%s}' % str(self._rand()),
                              str(self._rand()), 'comment')
        print 'suite.execute(%s)' % str(command)
        self._suite.execute(command)

    def change_variable_order(self):
        pass

    def write_cell_data(self):
        value = self._random.choice([
            '# something', 'foobar', ': FOR', '${var}', 'No Operation', '\\',
            'zoo%d' % self._rand(),
            '${%d}' % self._rand()
        ])
        self._macro_execute(
            ChangeCellValue(self._rand_row(), self._rand_col(), value))

    def write_for_loop(self):
        self._macro_execute(
            InsertArea((self._rand_row(), 0),
                       [[':FOR', '${i}', 'IN', '1', '2', 'foo'],
                        ['', 'No Operation']]))

    def _macro_execute(self, command):
        macro = self._random.choice(
            [c for c in [self._test, self._keyword] if c])
        if not self._skip:
            print '%s.execute(%s)' % (self._name(macro), str(command))
            macro.execute(command)

    def _name(self, macro):
        if macro == self._test:
            return 'test'
        return 'keyword'

    def add_row(self):
        self._macro_execute(AddRow(self._rand_row()))

    def remove_row(self):
        self._macro_execute(DeleteRow(self._rand_row()))

    def add_cell(self):
        self._macro_execute(InsertCell(self._rand_row(), self._rand_col()))

    def remove_cell(self):
        self._macro_execute(DeleteCell(self._rand_row(), self._rand_col()))

    def move_row_up(self):
        self._macro_execute(MoveRowsUp([self._rand_row()]))

    def move_row_down(self):
        self._macro_execute(MoveRowsDown([self._rand_row()]))

    def extract_keyword(self):
        first_row = self._rand_row()
        self._macro_execute(
            ExtractKeyword(
                'foo', '',
                [first_row, first_row + self._random.randint(1, 10)]))

    def add_library_import(self):
        if not self._skip:
            print 'suite.imports.execute(AddLibrary(["OperatingSystem", "", ""], "#comment"))'
            self._suite.imports.execute(
                AddLibrary(['OperatingSystem', '', ''], '#comment'))

    def remove_import(self):
        r = self._rand()
        if self._skip:
            return
        imps = list(self._suite.imports)
        if imps:
            i = int(r * len(imps))
            print 'suite.imports.execute(DeleteItem(%d))' % i
            self._suite.imports.execute(DeleteItem(i))

    def add_resource_import(self):
        if not self._skip:
            print 'suite.imports.execute(AddResource(["SomeNonExisting.txt"], "#comment"))'
            self._suite.imports.execute(
                AddResource(['SomeNonExisting.txt'], '#comment'))

    def change_import_order(self):
        self._change_order(range(sum(1 for _ in self._suite.imports)),
                           self._suite.imports)

    def rename_keyword(self):
        class Observer(object):
            def notify(self, *args):
                pass

            def finish(self, *args):
                pass

        self._macro_execute(RenameKeywordOccurrences('foo', 'bar', Observer()))

    def rename_test(self):
        if self._skip:
            self._rand()
            return
        self._test.execute(RenameTest('new_name%s' % str(self._rand())))

    def undo(self):
        self._macro_execute(Undo())

    def redo(self):
        self._macro_execute(Redo())

    def save(self):
        if self._skip:
            return
        command = SaveFile()
        print 'suite.execute(%s)' % str(command)
        self._suite.execute(command)

    def get_cell_info(self):
        macro = self._random.choice(
            [c for c in [self._test, self._keyword] if c])
        row = self._rand_row()
        col = self._rand_col()
        if self._skip:
            return
        print '%s.get_cell_info(%s, %s)' % (self._name(macro), row, col)
        macro.get_cell_info(row, col)
Пример #13
0
def construct_chief_controller(datapath):
    chief = ChiefController(Namespace())
    chief.load_data(datapath, NullObserver())
    return chief
Пример #14
0
class RIDE(object):

    def __init__(self, random, path):
        print 'chief = ChiefController(Namespace())'
        settings = RideSettings()
        self._chief = ChiefController(Namespace(settings=settings), settings=settings)
        self._path = path
        self._suite = None
        self._test = None
        self._keyword = None
        self._random = random
        self._skip = False

    def _skip_until_notified(self):
        self._skip = True

    def _do_not_skip(self):
        self._skip = False

    def open_test_dir(self):
        if self._skip:
            return
        self._open(os.path.join(self._path, 'testdir'))
        print 'suite = chief.data.children[0]'
        self._suite = self._chief.data.children[0]
        print 'test = list(t for t in suite.tests)[0]'
        self._test = list(t for t in self._suite.tests)[0]
        print 'keyword = list(k for k in suite.keywords)[0]'
        self._keyword = list(k for k in self._suite.keywords)[0]

    def open_suite_file(self):
        if self._skip:
            return
        self._open(os.path.join(self._path, 'testdir', 'Suite.txt'))
        print 'suite = chief.data'
        self._suite = self._chief.data
        print 'test = list(t for t in suite.tests)[0]'
        self._test = list(t for t in self._suite.tests)[0]
        print 'keyword = list(k for k in suite.keywords)[0]'
        self._keyword = list(k for k in self._suite.keywords)[0]

    def _open_resource_file(self):
        self._open(os.path.join(self._path, 'testdir', 'resources', 'resu.txt'))
        self._suite = None
        self._test = None
        self._keyword = None

    def _open(self, path):
        print 'chief.load_data("%s", NullObserver())' % path
        self._chief.load_data(path, NullObserver())

    def _create_suite(self):
        filename = os.path.join(self._path,'path_to_foo%s.txt' % str(self._rand()))
        print 'suite = chief.data.execute(AddSuite(NewDatafile("%s")))' % filename
        self._suite = self._chief.data.execute(AddTestCaseFile(filename))

    def create_test(self):
        if self._skip:
            self._rand()
            return
        testname = 'foobar'+str(self._rand())
        print 'test = suite.execute(AddTestCase("%s"))' % testname
        self._test = self._suite.execute(AddTestCase(testname))

    def change_test_order(self):
        self._change_order([t.data for t in self._suite.tests], self._suite.tests)

    def _change_order(self, items, controller):
        command = MoveUp if self._rand() > 0.5 else MoveDown
        r = self._rand()
        if self._skip:
            return
        items = list(items)
        if items:
            i = int(r*(len(items)))
            print '%s.execute(%s(items[%d]))' % (controller.__class__.__name__, command.__name__, i)
            controller.execute(command(items[i]))

    def _rand(self):
        return self._random.random()

    def _rand_row(self):
        return self._random.randint(0,100)

    def _rand_col(self):
        return self._random.randint(0, 30)

    def create_keyword(self):
        if self._skip:
            self._rand()
            return
        keyword_name = 'kwFoobar'+str(self._rand())
        print 'keyword = suite.execute(AddKeyword("%s"))' % keyword_name
        self._keyword = self._suite.execute(AddKeyword(keyword_name))

    def change_keyword_order(self):
        pass

    def add_variable(self):
        if self._skip:
            self._rand()
            self._rand()
            return
        command = AddVariable('${var%s}' % str(self._rand()), str(self._rand()), 'comment')
        print 'suite.execute(%s)' % str(command)
        self._suite.execute(command)

    def change_variable_order(self):
        pass

    def write_cell_data(self):
        prefix = self._random.choice(['# something', 'foobar', ': FOR', '${var}', 'No Operation', '\\'])
        self._macro_execute(ChangeCellValue(self._rand_row(), self._rand_col(), prefix + str(self._rand())))

    def _macro_execute(self, command):
        macro = self._random.choice([c for c in [self._test, self._keyword] if c])
        if not self._skip:
            print '%s.execute(%s)' % (self._name(macro), str(command))
            macro.execute(command)

    def _name(self, macro):
        if macro == self._test:
            return 'test'
        return 'keyword'

    def add_row(self):
        self._macro_execute(AddRow(self._rand_row()))

    def remove_row(self):
        self._macro_execute(DeleteRow(self._rand_row()))

    def add_cell(self):
        self._macro_execute(InsertCell(self._rand_row(), self._rand_col()))

    def remove_cell(self):
        self._macro_execute(DeleteCell(self._rand_row(), self._rand_col()))

    def move_row_up(self):
        self._macro_execute(MoveRowsUp([self._rand_row()]))

    def move_row_down(self):
        self._macro_execute(MoveRowsDown([self._rand_row()]))

    def extract_keyword(self):
        first_row = self._rand_row()
        self._macro_execute(ExtractKeyword('foo', '', [first_row, first_row+self._random.randint(1,10)]))

    def add_library_import(self):
        if not self._skip:
            print 'suite.imports.execute(AddLibrary(["OperatingSystem", "", ""], "#comment"))'
            self._suite.imports.execute(AddLibrary(['OperatingSystem', '', ''], '#comment'))

    def remove_import(self):
        r = self._rand()
        if self._skip:
            return
        imps = list(self._suite.imports)
        if imps:
            i = int(r*len(imps))
            print 'suite.imports.execute(DeleteItem(%d))' % i
            self._suite.imports.execute(DeleteItem(i))

    def add_resource_import(self):
        if not self._skip:
            print 'suite.imports.execute(AddResource(["SomeNonExisting.txt"], "#comment"))'
            self._suite.imports.execute(AddResource(['SomeNonExisting.txt'], '#comment'))

    def change_import_order(self):
        self._change_order(range(sum(1 for _ in self._suite.imports)), self._suite.imports)

    def rename_keyword(self):
        class Observer(object):
            def notify(self, *args):
                pass
            def finish(self, *args):
                pass
        self._macro_execute(RenameKeywordOccurrences('foo', 'bar', Observer()))

    def rename_test(self):
        if self._skip:
            self._rand()
            return
        self._test.execute(RenameTest('new_name%s' % str(self._rand())))

    def undo(self):
        self._macro_execute(Undo())

    def redo(self):
        self._macro_execute(Redo())

    def save(self):
        if self._skip:
            return
        command = SaveFile()
        print 'suite.execute(%s)' % str(command)
        self._suite.execute(command)

    def get_cell_info(self):
        macro = self._random.choice([c for c in [self._test, self._keyword] if c])
        row = self._rand_row()
        col = self._rand_col()
        print '%s.get_cell_info(%s, %s)' % (self._name(macro), row, col)
        macro.get_cell_info(row, col)
Пример #15
0
def construct_chief_controller(datapath):
    settings = FakeSettings()
    chief = ChiefController(Namespace(settings), settings)
    chief.load_data(datapath, NullObserver())
    return chief
Пример #16
0
 def __init__(self, namespace, settings=None):
     self.removed_files = []
     self.serialized_files = []
     ChiefController.__init__(self, namespace, settings)
Пример #17
0
 def _load(self, testcasefile):
     ns = Namespace(FakeSettings())
     chief =  ChiefController(ns)
     chief.load_datafile(testcasefile,
                         MessageRecordingLoadObserver())
     return ns, chief._controller.data
Пример #18
0
class RIDE(object):
    def __init__(self, random, path):
        print "librarydatabase.initialize_database()"
        print librarydatabase.initialize_database()
        print "settings = RideSettings()"
        print "chief = ChiefController(Namespace(settings=settings), settings=settings)"
        settings = RideSettings()
        self._chief = ChiefController(Namespace(settings=settings), settings=settings)
        self._path = path
        self._suite = None
        self._test = None
        self._keyword = None
        self._random = random
        self._skip = False

    def _skip_until_notified(self):
        self._skip = True

    def _do_not_skip(self):
        self._skip = False

    def open_test_dir(self):
        if self._skip:
            return
        self._open(os.path.join(self._path, "testdir"))
        print "suite = chief.data.children[0]"
        self._suite = self._chief.data.children[0]
        print "test = list(t for t in suite.tests)[0]"
        self._test = list(t for t in self._suite.tests)[0]
        print "keyword = list(k for k in suite.keywords)[0]"
        self._keyword = list(k for k in self._suite.keywords)[0]

    def open_suite_file(self):
        if self._skip:
            return
        self._open(os.path.join(self._path, "testdir", "Suite.txt"))
        print "suite = chief.data"
        self._suite = self._chief.data
        print "test = list(t for t in suite.tests)[0]"
        self._test = list(t for t in self._suite.tests)[0]
        print "keyword = list(k for k in suite.keywords)[0]"
        self._keyword = list(k for k in self._suite.keywords)[0]

    def _open_resource_file(self):
        self._open(os.path.join(self._path, "testdir", "resources", "resu.txt"))
        self._suite = None
        self._test = None
        self._keyword = None

    def _open(self, path):
        print 'chief.load_data("%s", NullObserver())' % path
        self._chief.load_data(path, NullObserver())

    def _create_suite(self):
        filename = os.path.join(self._path, "path_to_foo%s.txt" % str(self._rand()))
        print 'suite = chief.data.execute(AddSuite(NewDatafile("%s")))' % filename
        self._suite = self._chief.data.execute(AddTestCaseFile(filename))

    def create_test(self):
        if self._skip:
            self._rand()
            return
        testname = "foobar" + str(self._rand())
        print 'test = suite.execute(AddTestCase("%s"))' % testname
        self._test = self._suite.execute(AddTestCase(testname))

    def change_test_order(self):
        self._change_order([t.data for t in self._suite.tests], self._suite.tests)

    def _change_order(self, items, controller):
        command = MoveUp if self._rand() > 0.5 else MoveDown
        r = self._rand()
        if self._skip:
            return
        items = list(items)
        if items:
            i = int(r * (len(items)))
            print "%s.execute(%s(items[%d]))" % (controller.__class__.__name__, command.__name__, i)
            controller.execute(command(items[i]))

    def _rand(self):
        return self._random.random()

    def _rand_row(self):
        return self._random.randint(0, 100)

    def _rand_col(self):
        return self._random.randint(0, 30)

    def create_keyword(self):
        if self._skip:
            self._rand()
            return
        keyword_name = "kwFoobar" + str(self._rand())
        print 'keyword = suite.execute(AddKeyword("%s"))' % keyword_name
        self._keyword = self._suite.execute(AddKeyword(keyword_name))

    def change_keyword_order(self):
        pass

    def add_variable(self):
        if self._skip:
            self._rand()
            self._rand()
            return
        command = AddVariable("${var%s}" % str(self._rand()), str(self._rand()), "comment")
        print "suite.execute(%s)" % str(command)
        self._suite.execute(command)

    def change_variable_order(self):
        pass

    def write_cell_data(self):
        value = self._random.choice(
            [
                "# something",
                "foobar",
                ": FOR",
                "${var}",
                "No Operation",
                "\\",
                "zoo%d" % self._rand(),
                "${%d}" % self._rand(),
            ]
        )
        self._macro_execute(ChangeCellValue(self._rand_row(), self._rand_col(), value))

    def write_for_loop(self):
        self._macro_execute(
            InsertArea((self._rand_row(), 0), [[":FOR", "${i}", "IN", "1", "2", "foo"], ["", "No Operation"]])
        )

    def _macro_execute(self, command):
        macro = self._random.choice([c for c in [self._test, self._keyword] if c])
        if not self._skip:
            print "%s.execute(%s)" % (self._name(macro), str(command))
            macro.execute(command)

    def _name(self, macro):
        if macro == self._test:
            return "test"
        return "keyword"

    def add_row(self):
        self._macro_execute(AddRow(self._rand_row()))

    def remove_row(self):
        self._macro_execute(DeleteRow(self._rand_row()))

    def add_cell(self):
        self._macro_execute(InsertCell(self._rand_row(), self._rand_col()))

    def remove_cell(self):
        self._macro_execute(DeleteCell(self._rand_row(), self._rand_col()))

    def move_row_up(self):
        self._macro_execute(MoveRowsUp([self._rand_row()]))

    def move_row_down(self):
        self._macro_execute(MoveRowsDown([self._rand_row()]))

    def extract_keyword(self):
        first_row = self._rand_row()
        self._macro_execute(ExtractKeyword("foo", "", [first_row, first_row + self._random.randint(1, 10)]))

    def add_library_import(self):
        if not self._skip:
            print 'suite.imports.execute(AddLibrary(["OperatingSystem", "", ""], "#comment"))'
            self._suite.imports.execute(AddLibrary(["OperatingSystem", "", ""], "#comment"))

    def remove_import(self):
        r = self._rand()
        if self._skip:
            return
        imps = list(self._suite.imports)
        if imps:
            i = int(r * len(imps))
            print "suite.imports.execute(DeleteItem(%d))" % i
            self._suite.imports.execute(DeleteItem(i))

    def add_resource_import(self):
        if not self._skip:
            print 'suite.imports.execute(AddResource(["SomeNonExisting.txt"], "#comment"))'
            self._suite.imports.execute(AddResource(["SomeNonExisting.txt"], "#comment"))

    def change_import_order(self):
        self._change_order(range(sum(1 for _ in self._suite.imports)), self._suite.imports)

    def rename_keyword(self):
        class Observer(object):
            def notify(self, *args):
                pass

            def finish(self, *args):
                pass

        self._macro_execute(RenameKeywordOccurrences("foo", "bar", Observer()))

    def rename_test(self):
        if self._skip:
            self._rand()
            return
        self._test.execute(RenameTest("new_name%s" % str(self._rand())))

    def undo(self):
        self._macro_execute(Undo())

    def redo(self):
        self._macro_execute(Redo())

    def save(self):
        if self._skip:
            return
        command = SaveFile()
        print "suite.execute(%s)" % str(command)
        self._suite.execute(command)

    def get_cell_info(self):
        macro = self._random.choice([c for c in [self._test, self._keyword] if c])
        row = self._rand_row()
        col = self._rand_col()
        if self._skip:
            return
        print "%s.get_cell_info(%s, %s)" % (self._name(macro), row, col)
        macro.get_cell_info(row, col)