def _test_multitab(browser): project_dict, workspace_page = startup(browser) # Open code editor. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() # Create the file (code editor automatically indents). test_code1 = """ def f(x): return math.sqrt(x)""" test_code2 = """ def g(x): return x**2""" editor_page.new_file('test1.py', test_code1) editor_page.new_file('test2.py', test_code2) editor_page.edit_file('test1.py') editor_page.add_text_to_file('\n #an extra comment line') input_code1 = editor_page.get_code() editor_page.save_document() editor_page.edit_file('test2.py') editor_page.add_text_to_file('\n #an extra comment line') input_code2 = editor_page.get_code() # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Go back to code editor, open file, verify source code if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.edit_file('test1.py') # this file was saved time.sleep(1) loaded_code = editor_page.get_code() eq(input_code1, loaded_code) editor_page.edit_file('test2.py') # this file was not saved time.sleep(1) loaded_code = editor_page.get_code() neq(input_code2, loaded_code) # Clean up. browser.close() browser.switch_to_window(workspace_window) closeout(project_dict, workspace_page)
def edit_file(workspace_page): if broken_chrome(): print "Skipping testing metadata after editing file due to broken chrome driver." return False workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() editor_page.edit_file('test_file.py', dclick=False) editor_page.add_text_to_file('#just a comment\n') editor_page.save_document(check=False) browser.switch_to_window(workspace_window) port = workspace_page.port workspace_page = WorkspacePage.verify(browser, port)
def _test_editfile(browser): # Check ability to open code editor by double clicking on file in workspace. project_dict, workspace_page = startup(browser) # create a couple of files file1 = 'test1.py' workspace_page.new_file(file1) file2 = 'test2.py' workspace_page.new_file(file2) # verify file is opened in code editor by double clicking workspace_window = browser.current_window_handle editor_page = workspace_page.edit_file(file1) eq(str(editor_page.get_tab_label()), '/' + file1) # verify different file is opened in code editor by double clicking browser.switch_to_window(workspace_window) editor_page = workspace_page.edit_file(file2) eq(str(editor_page.get_tab_label()), '/' + file2) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # verify code editor can be re-opened by double clicking on file workspace_window = browser.current_window_handle if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.edit_file(file1) eq(str(editor_page.get_tab_label()), '/' + file1) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Clean up. closeout(project_dict, workspace_page)
def _test_crlf(browser): # Test ability to handle a file with Windows-style CR/LF line terminations project_dict, workspace_page = startup(browser) # add a Windows notepad generated python file filename = 'notepad.py' filepath = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/notepad.py') workspace_page.add_file(filepath) # open file in code editor workspace_window = browser.current_window_handle editor_page = workspace_page.edit_file(filename) eq(str(editor_page.get_tab_label()), '/' + filename) # add a comment and save comment = '# a comment' editor_page.append_text_to_file(comment) editor_page.save_document() # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # re-open file and verify comment was successfully added workspace_window = browser.current_window_handle if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.edit_file(filename) assert editor_page.get_code().endswith(comment) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Clean up. closeout(project_dict, workspace_page)
def _test_console_errors(browser): project_dict, workspace_page = startup(browser) # Set input to illegal value. workspace_page.add_library_item_to_dataflow('openmdao.main.assembly.Assembly', 'top') top = workspace_page.get_dataflow_figure('driver', 'top') editor = top.editor_page(double_click=False, base_type='Driver') editor.move(-100, -40) # Make viewable on small screen. inputs = editor.get_inputs() inputs.rows[4].cells[2].click() inputs[4][2] = '42' # printvars expected = "TraitError: The 'printvars' trait of a " \ "Run_Once instance must be a list of items " \ "which are a legal value, but a value of 42 " \ "<type 'int'> was specified." time.sleep(0.5) assert workspace_page.history.endswith(expected) editor.close() # Attempt to save file with syntax error. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() editor_page.new_file('bug.py', """ from openmdao.main.api import Component class Bug(Component): def execute(self) pass """, check=False) # We expect 2 notifiers: save successful and file error. # These will likely overlap in a manner that 'Ok' is found but # later is hidden by the second notifier. try: message = NotifierPage.wait(editor_page, base_id='file-error') except WebDriverException as exc: err = str(exc) if 'Element is not clickable' in err: NotifierPage.wait(editor_page) message = NotifierPage.wait(editor_page) else: NotifierPage.wait(editor_page) eq(message, 'Error in file bug.py: invalid syntax (bug.py, line 6)') browser.close() browser.switch_to_window(workspace_window) # Load file with instantiation error. workspace_window = browser.current_window_handle if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.open_editor() editor_page.new_file('bug2.py', """ from openmdao.main.api import Component class Bug2(Component): def __init__(self): raise RuntimeError("__init__ failed") """) browser.close() browser.switch_to_window(workspace_window) workspace_page.add_library_item_to_dataflow('bug2.Bug2', 'bug', check=False) expected = "NameError: unable to create object of type 'bug2.Bug2': __init__ failed" assert workspace_page.history.endswith(expected) # Clean up. closeout(project_dict, workspace_page)
def _test_macro(browser): project_dict, workspace_page = startup(browser) # Open code editor. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() # Create a file (code editor automatically indents). editor_page.new_file('foo.py', """ from openmdao.main.api import Component from openmdao.main.datatypes.api import Float class Foo(Component): a = Float(0.0, iotype='in') b = Float(0.0, iotype='out') """) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Add some Foo instances. workspace_page.add_library_item_to_dataflow('openmdao.main.assembly.Assembly', 'top') workspace_page.show_dataflow('top') time.sleep(2) # Wait for it to get registered. workspace_page.set_library_filter('In Project') workspace_page.add_library_item_to_dataflow('foo.Foo', 'comp1') workspace_page.add_library_item_to_dataflow('foo.Foo', 'comp2') comp1 = workspace_page.get_dataflow_figure('comp1', 'top') comp2 = workspace_page.get_dataflow_figure('comp2', 'top') conn_page = workspace_page.connect(comp1, comp2) conn_page.connect_vars('comp1.b', 'comp2.a') conn_page.close() workspace_page.commit_project('added some Foos') if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.open_editor() editor_page.edit_file('foo.py', dclick=False) editor_page.add_text_to_file('#just a comment\n') # forces a save and reload of project editor_page.save_document(overwrite=True, check=False) browser.switch_to_window(workspace_window) port = workspace_page.port workspace_page = WorkspacePage.verify(browser, port) workspace_page.show_dataflow('top') time.sleep(0.5) eq(sorted(workspace_page.get_dataflow_component_names()), ['comp1', 'comp2', 'driver', 'top']) # Check if running a component is recorded (it shouldn't be). top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') history = workspace_page.history.split('\n') eq(history[-2], 'Executing...') eq(history[-1], 'Execution complete.') workspace_page.toggle_files('foo.py') workspace_page.expand_folder('_macros') editor = workspace_page.edit_file('_macros/default') contents = editor.get_code() browser.close() browser.switch_to_window(workspace_window) for line in contents.split('\n'): if 'run' in line: raise AssertionError(line) # Check if command errors are recorded (they shouldn't be). workspace_page.do_command('print xyzzy', ack=False) NotifierPage.wait(workspace_page, base_id='command') expected = "NameError: name 'xyzzy' is not defined" assert workspace_page.history.endswith(expected) editor = workspace_page.edit_file('_macros/default') contents = editor.get_code() browser.close() browser.switch_to_window(workspace_window) for line in contents.split('\n'): if 'xyzzy' in line: raise AssertionError(line) # Clean up. closeout(project_dict, workspace_page)
def _test_console_errors(browser): project_dict, workspace_page = startup(browser) # Set input to illegal value. workspace_page.add_library_item_to_dataflow( 'openmdao.main.assembly.Assembly', 'top') top = workspace_page.get_dataflow_figure('top', '') editor = top.editor_page(double_click=False, base_type='Assembly') editor.move(-100, -40) # Make viewable on small screen. inputs = editor.get_inputs() inputs.rows[3].cells[1].click() inputs = editor.get_inputs() inputs.rows[4].cells[2].click() inputs[4][2] = '42' # 'excludes' expected = "TraitError: The 'excludes' trait of a RecordingOptions instance" \ " must be a list of items which are any value, but a value of 42" \ " <type 'int'> was specified." time.sleep(0.5) assert workspace_page.history.endswith(expected) editor.close() # Attempt to save file with syntax error. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() editor_page.new_file('bug.py', """ from openmdao.main.api import Component class Bug(Component): def execute(self) pass """, check=False) # We expect 2 notifiers: save successful and file error. # These will likely overlap in a manner that 'Ok' is found but # later is hidden by the second notifier. try: message = NotifierPage.wait(editor_page, base_id='file-error') except WebDriverException as exc: err = str(exc) if 'Element is not clickable' in err: NotifierPage.wait(editor_page) message = NotifierPage.wait(editor_page) else: raise else: NotifierPage.wait(editor_page) eq(message, 'Error in file bug.py: invalid syntax (bug.py, line 6)') browser.close() browser.switch_to_window(workspace_window) # Load file with instantiation error. workspace_window = browser.current_window_handle if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.open_editor() editor_page.new_file( 'bug2.py', """ from openmdao.main.api import Component class Bug2(Component): def __init__(self): raise RuntimeError("__init__ failed") """) browser.close() browser.switch_to_window(workspace_window) workspace_page.add_library_item_to_dataflow('bug2.Bug2', 'bug', check=False) expected = "NameError: unable to create object of type 'bug2.Bug2': __init__ failed" assert workspace_page.history.endswith(expected) # Clean up. closeout(project_dict, workspace_page)
def _test_macro(browser): project_dict, workspace_page = startup(browser) # Open code editor. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() # Create a file (code editor automatically indents). editor_page.new_file( 'foo.py', """ from openmdao.main.api import Component from openmdao.main.datatypes.api import Float class Foo(Component): a = Float(0.0, iotype='in') b = Float(0.0, iotype='out') """) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Add some Foo instances. workspace_page.add_library_item_to_dataflow( 'openmdao.main.assembly.Assembly', 'top') workspace_page.show_dataflow('top') time.sleep(2) # Wait for it to get registered. workspace_page.set_library_filter('In Project') workspace_page.add_library_item_to_dataflow('foo.Foo', 'comp1') workspace_page.add_library_item_to_dataflow('foo.Foo', 'comp2') comp1 = workspace_page.get_dataflow_figure('comp1', 'top') comp2 = workspace_page.get_dataflow_figure('comp2', 'top') conn_page = workspace_page.connect(comp1, comp2) conn_page.connect_vars('comp1.b', 'comp2.a') conn_page.close() workspace_page.commit_project('added some Foos') if broken_chrome(): raise SkipTest('Test broken for chrome/selenium combination') editor_page = workspace_page.open_editor() editor_page.edit_file('foo.py', dclick=False) editor_page.add_text_to_file('#just a comment\n') # forces a save and reload of project editor_page.save_document(overwrite=True, check=False) browser.switch_to_window(workspace_window) port = workspace_page.port workspace_page = WorkspacePage.verify(browser, port) workspace_page.show_dataflow('top') time.sleep(0.5) eq(sorted(workspace_page.get_dataflow_component_names()), ['comp1', 'comp2', 'driver', 'top']) # Check if running a component is recorded (it shouldn't be). top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') history = workspace_page.history.split('\n') eq(history[-2], 'Executing...') eq(history[-1], 'Execution complete.') workspace_page.toggle_files('foo.py') workspace_page.expand_folder('_macros') editor = workspace_page.edit_file('_macros/default') contents = editor.get_code() browser.close() browser.switch_to_window(workspace_window) for line in contents.split('\n'): if 'run' in line: raise AssertionError(line) # Check if command errors are recorded (they shouldn't be). workspace_page.do_command('print xyzzy', ack=False) NotifierPage.wait(workspace_page, base_id='command') expected = "NameError: name 'xyzzy' is not defined" assert workspace_page.history.endswith(expected) editor = workspace_page.edit_file('_macros/default') contents = editor.get_code() browser.close() browser.switch_to_window(workspace_window) for line in contents.split('\n'): if 'xyzzy' in line: raise AssertionError(line) # Clean up. closeout(project_dict, workspace_page)