def _test_newfile(browser): # Creates a file in the GUI. projects_page, project_info_page, project_dict, workspace_page = startup(browser) # Open code editor. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() # test the 'ok' and 'cancel' buttons on the new file dialog dlg = editor_page.new_file_dialog() dlg.set_text("ok_file1") dlg.click_ok() NotifierPage.wait(editor_page) dlg = editor_page.new_file_dialog() dlg.set_text("cancel_file") dlg.click_cancel() dlg = editor_page.new_file_dialog() dlg.set_text("ok_file2") dlg.click_ok() NotifierPage.wait(editor_page) file_names = editor_page.get_files() expected_file_names = ["ok_file1", "ok_file2"] if sorted(file_names) != sorted(expected_file_names): raise TestCase.failureException( "Expected file names, '%s', should match existing file names, '%s'" % (expected_file_names, file_names) ) # Create the file (code editor automatically indents). editor_page.new_file( "plane.py", """ from openmdao.main.api import Component from openmdao.lib.datatypes.api import Float # lines will be auto-indented by ace editor class Plane(Component): x1 = Float(0.0, iotype='in') x2 = Float(0.0, iotype='in') x3 = Float(0.0, iotype='in') f_x = Float(0.0, iotype='out') """, ) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Drag over Plane. workspace_page.show_dataflow("top") workspace_page.set_library_filter("In Project") workspace_page.add_library_item_to_dataflow("plane.Plane", "plane") # Clean up. closeout(projects_page, project_info_page, project_dict, workspace_page)
def _test_console_errors(browser): #projects_page, project_info_page, project_dict, workspace_page = startup(browser) project_dict, workspace_page = startup(browser) # Set input to illegal value. top = workspace_page.get_dataflow_figure('driver', 'top') editor = top.editor_page(double_click=False, base_type='Driver') inputs = editor.get_inputs() inputs.rows[2].cells[1].click() inputs[2][2] = '42' # printvars message = NotifierPage.wait(editor) eq( message, "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.") 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) message = NotifierPage.wait(editor_page, base_id='file-error') browser.close() browser.switch_to_window(workspace_window) eq(message, 'invalid syntax (bug.py, line 6)\n def execute(self)') # Load file with instantiation error. workspace_window = browser.current_window_handle 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) message = NotifierPage.wait(workspace_page) eq( message, "NameError: unable to create object of type 'bug2.Bug2': __init__ failed" ) # Clean up. #closeout(projects_page, project_info_page, project_dict, workspace_page) closeout(project_dict, workspace_page)
def _test_newfile(browser): # Creates a file in the GUI. projects_page, project_info_page, project_dict, workspace_page = startup( browser) # Open code editor. workspace_window = browser.current_window_handle editor_page = workspace_page.open_editor() # test the 'ok' and 'cancel' buttons on the new file dialog dlg = editor_page.new_file_dialog() dlg.set_text('ok_file1') dlg.click_ok() NotifierPage.wait(editor_page) dlg = editor_page.new_file_dialog() dlg.set_text('cancel_file') dlg.click_cancel() dlg = editor_page.new_file_dialog() dlg.set_text('ok_file2') dlg.click_ok() NotifierPage.wait(editor_page) file_names = editor_page.get_files() expected_file_names = ['ok_file1', 'ok_file2'] if sorted(file_names) != sorted(expected_file_names): raise TestCase.failureException( "Expected file names, '%s', should match existing file names, '%s'" % (expected_file_names, file_names)) # Create the file (code editor automatically indents). editor_page.new_file( 'plane.py', """ from openmdao.main.api import Component from openmdao.lib.datatypes.api import Float # lines will be auto-indented by ace editor class Plane(Component): x1 = Float(0.0, iotype='in') x2 = Float(0.0, iotype='in') x3 = Float(0.0, iotype='in') f_x = Float(0.0, iotype='out') """) # Back to workspace. browser.close() browser.switch_to_window(workspace_window) # Drag over Plane. workspace_page.show_dataflow('top') workspace_page.set_library_filter('In Project') workspace_page.add_library_item_to_dataflow('plane.Plane', 'plane') # Clean up. closeout(projects_page, project_info_page, project_dict, workspace_page)
def _test_console_errors(browser): projects_page, project_info_page, project_dict, workspace_page = startup(browser) # Set input to illegal value. top = workspace_page.get_dataflow_figure("driver", "top") editor = top.editor_page(double_click=False, base_type="Driver") inputs = editor.get_inputs() inputs[2][2] = "42" # printvars message = NotifierPage.wait(editor) eq( message, "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.", ) 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, ) message = NotifierPage.wait(editor_page, base_id="file-error") eq(message, "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 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) message = NotifierPage.wait(workspace_page) eq(message, "NameError: unable to create object of type 'bug2.Bug2': __init__ failed") # Clean up. closeout(projects_page, project_info_page, project_dict, workspace_page)
def _test_slot_subclass(browser): # test that a slot will accept subclasses project_dict, workspace_page = startup(browser) file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/slot_test.py') workspace_page.add_file(file_path) name = workspace_page.put_element_on_grid("AutoAssemb") aa = workspace_page.get_dataflow_figure(name) editor = aa.editor_page(double_click=False) editor.move(-200, 200) inputs = editor.get_inputs() expected = [ ['', 'input', '0', '', ''], ['', 'directory', '', '', 'If non-blank, the directory to execute in.'], ['', 'force_execute', 'False', '', 'If True, always execute even if all IO traits are valid.'], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) inputs[0][2] = "10" aa.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') outputs = editor.get_outputs() expected = [ ['', 'output', '80', '', ''], ['', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed."], ['', 'exec_count', '1', '', 'Number of times this Component has been executed.'], ['', 'itername', '', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) editor.show_slots() recorders_slot = find_slot_figure(workspace_page, 'd2', prefix=name) workspace_page.fill_slot_from_library(recorders_slot, 'Dummy2') aa.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') outputs = editor.get_outputs() expected = [ ['', 'output', '160', '', ''], ['', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed."], ['', 'exec_count', '2', '', 'Number of times this Component has been executed.'], ['', 'itername', '', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) # Clean up. closeout(project_dict, workspace_page)
def _test_array_parameter(browser): # Test adding an array parameter. project_dict, workspace_page = startup(browser) file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/array_parameters.py') workspace_page.add_file(file_path) workspace_page.add_library_item_to_dataflow( 'array_parameters.ArrayParameters', 'top') # Add parameter to driver. driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor('parameters_tab').click() dialog = editor.new_parameter() dialog.target = 'paraboloid.x' dialog.low = '-50' dialog.high = '[40, 50]' dialog.scaler = '[[1., 1]]' dialog('ok').click() parameters = editor.get_parameters() expected = [[ '', 'paraboloid.x', '-50', '40,50', '1,1', '0', '', 'paraboloid.x' ]] eq(len(parameters.value), len(expected)) for i, row in enumerate(parameters.value): eq(row, expected[i]) editor.close() time.sleep(1) # Run optimization. top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') # Check results. workspace_page.do_command("top.paraboloid.x[0][0]") x00 = workspace_page.history.split("\n")[-1] workspace_page.do_command("top.paraboloid.x[0][1]") x01 = workspace_page.history.split("\n")[-1] if abs(float(x00) - 6.6667) > 0.01: raise TestCase.failureException( "Parameter x[0][0] did not reach correct value, but instead is %s" % x00) if abs(float(x01) - -7.3333) > 0.01: raise TestCase.failureException( "Parameter x[0][1] did not reach correct value, but instead is %s" % x01) closeout(project_dict, workspace_page)
def _test_array_parameter(browser): # Test adding an array parameter. project_dict, workspace_page = startup(browser) file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/array_parameters.py') workspace_page.add_file(file_path) workspace_page.add_library_item_to_dataflow('array_parameters.ArrayParameters', 'top') # Add parameter to driver. driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor('parameters_tab').click() dialog = editor.new_parameter() dialog.target = 'paraboloid.x' dialog.low = '-50' dialog.high = '[40, 50]' dialog.scaler = '[[1., 1]]' dialog('ok').click() parameters = editor.get_parameters() expected = [['', 'paraboloid.x', '-50', '40,50', '1,1', '0', '', 'paraboloid.x']] eq(len(parameters.value), len(expected)) for i, row in enumerate(parameters.value): eq(row, expected[i]) editor.close() time.sleep(1) # Run optimization. top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') # Check results. workspace_page.do_command("top.paraboloid.x[0][0]") x00 = workspace_page.history.split("\n")[-1] workspace_page.do_command("top.paraboloid.x[0][1]") x01 = workspace_page.history.split("\n")[-1] if abs(float(x00) - 6.6667) > 0.01: raise TestCase.failureException( "Parameter x[0][0] did not reach correct value, but instead is %s" % x00) if abs(float(x01) - -7.3333) > 0.01: raise TestCase.failureException( "Parameter x[0][1] did not reach correct value, but instead is %s" % x01) closeout(project_dict, workspace_page)
def _test_basic(browser): project_dict, workspace_page = startup(browser) filename = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/rosen_suzuki.py') workspace_page.add_file(filename) # Add a NestedSimulation. workspace_page.add_library_item_to_dataflow('rosen_suzuki.NestedSimulation', 'nested', offset=(300, 300)) # Verify full workflow shown. workspace_page('workflow_tab').click() eq(len(workspace_page.get_workflow_figures()), 2) eq(len(workspace_page.get_workflow_component_figures()), 5) # Verify flow layout is horizontal and can be switched to vertical sim = workspace_page.get_workflow_figure('sim.driver') assert sim.horizontal sim.flip() assert not sim.horizontal # Verify workflow can be collapsed and expanded sim.collapse() assert sim.collapsed sim.expand() assert sim.expanded # Verify that component state is represented properly driver = workspace_page.get_workflow_component_figure('sim.driver') assert driver.state == 'INVALID' driver.run() time.sleep(2.0) message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') assert driver.state == 'VALID' # Verify workflow can be cleared nested = workspace_page.get_workflow_figure('nested.driver') nested.clear() eq(len(workspace_page.get_workflow_component_figures()), 1) # Clean up. closeout(project_dict, workspace_page)
def _test_basic(browser): project_dict, workspace_page = startup(browser) filename = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/rosen_suzuki.py') workspace_page.add_file(filename) # Add a NestedSimulation. workspace_page.add_library_item_to_dataflow( 'rosen_suzuki.NestedSimulation', 'nested', offset=(300, 300)) # Verify full workflow shown. workspace_page('workflow_tab').click() eq(len(workspace_page.get_workflow_figures()), 2) eq(len(workspace_page.get_workflow_component_figures()), 5) # Verify flow layout is horizontal and can be switched to vertical sim = workspace_page.get_workflow_figure('sim.driver') assert sim.horizontal sim.flip() assert not sim.horizontal # Verify workflow can be collapsed and expanded sim.collapse() assert sim.collapsed sim.expand() assert sim.expanded # Verify that component state is represented properly driver = workspace_page.get_workflow_component_figure('sim.driver') assert driver.state == 'INVALID' driver.run() time.sleep(2.0) message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') assert driver.state == 'VALID' # Verify workflow can be cleared nested = workspace_page.get_workflow_figure('nested.driver') nested.clear() eq(len(workspace_page.get_workflow_component_figures()), 1) # 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[0].cells[2].click() inputs[0][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) eq(workspace_page.history, 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 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_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_connect(browser): project_dict, workspace_page = startup(browser) # Import connect.py file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/connect.py') workspace_page.add_file(file_path) workspace_page.add_library_item_to_dataflow('connect.Topp', 'top') # Connect components. workspace_page.show_dataflow('top') 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.move(-100, -100) eq(conn_page.dialog_title, 'Connections: top') eq(conn_page.source_component, 'comp1') eq(conn_page.target_component, 'comp2') for prefix in ('b', 'e', 'f', 'i', 's'): conn_page.connect_vars('comp1.' + prefix + '_out', 'comp2.' + prefix + '_in') time.sleep(0.5) # Wait for display update. conn_page.close() # Set inputs (re-fetch required after updating). comp1 = workspace_page.get_dataflow_figure('comp1', 'top') props = comp1.properties_page() props.move(0, -120) # Move up for short displays. time.sleep(0.5) # Wait for header update. eq(props.header, 'Connectable: top.comp1') props.move(-100, -100) inputs = props.inputs eq(inputs[4].value, ['s_in', '']) inputs[4][1] = 'xyzzy' inputs = props.inputs eq(inputs[2].value, ['f_in', '0']) inputs[2][1] = '2.781828' inputs = props.inputs eq(inputs[3].value, ['i_in', '0']) inputs[3][1] = '42' inputs = props.inputs eq(inputs[0].value, ['b_in', 'False']) inputs.rows[0].cells[1].click() browser.find_element_by_xpath('//*[@id="bool-editor-b_in"]/option[1]').click() #inputs.rows[0].cells[0].click() #inputs[0][1] = 'True' inputs = props.inputs eq(inputs[1].value, ['e_in', '1']) inputs.rows[1].cells[1].click() browser.find_element_by_xpath('//*[@id="editor-enum-e_in"]/option[3]').click() #inputs.rows[2].cells[0].click() #inputs[2][1] = '3' props.close() # Run the simulation. top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') # Verify outputs. comp2 = workspace_page.get_dataflow_figure('comp2', 'top') editor = comp2.editor_page() editor.move(-100, 0) eq(editor.dialog_title, 'Connectable: top.comp2') outputs = editor.get_outputs() expected = [ ['', 'b_out', 'True', '', ''], ['', 'e_out', '3', '', ''], ['', 'f_out', '2.781828', '', ''], ['', 'i_out', '42', '', ''], ['', 's_out', 'xyzzy', '', ''], ['', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed."], ['', 'exec_count', '1', '', 'Number of times this Component has been executed.'], ['', 'itername', '1-2', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) editor.close() # Clean up. closeout(project_dict, workspace_page)
def _test_connections(browser): # Check connection frame functionality. project_dict, workspace_page = startup(browser) filename = pkg_resources.resource_filename('openmdao.examples.enginedesign', 'vehicle_singlesim.py') workspace_page.add_file(filename) asm_name = 'sim' workspace_page.add_library_item_to_dataflow('vehicle_singlesim.VehicleSim', asm_name) # show dataflow for vehicle workspace_page.expand_object('sim') workspace_page.show_dataflow('sim.vehicle') workspace_page.hide_left() vehicle = workspace_page.get_dataflow_figure('vehicle', 'sim') # no connections between assembly vars conn_page = vehicle.connections_page() conn_page.move(-50, -100) eq(conn_page.dialog_title, 'Connections: vehicle') eq(conn_page.source_component, '-- Assembly --') eq(conn_page.target_component, '-- Assembly --') eq(conn_page.count_variable_connections(), 0) # two connections between engine and chassis conn_page.set_source_component('engine') conn_page.set_target_component('chassis') eq(conn_page.count_variable_figures(), 20) eq(conn_page.count_variable_connections(), 2) conn_page.show_connected_variables() time.sleep(0.5) eq(conn_page.count_variable_figures(), 4) eq(conn_page.count_variable_connections(), 2) eq(sorted(conn_page.get_variable_names()), ['engine_torque', 'engine_weight', 'mass_engine', 'torque']) # one connection between transmission and engine (RPM) conn_page.set_source_component('transmission') conn_page.set_target_component('engine') eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['RPM', 'RPM']) # disconnect transmission conn_page.close() # Sometimes obscures dataflow. tranny = workspace_page.get_dataflow_figure('transmission', 'sim.vehicle') tranny.disconnect() vehicle = workspace_page.get_dataflow_figure('vehicle', 'sim') conn_page = vehicle.connections_page() conn_page.move(-50, -100) conn_page.show_connected_variables() # now there are no connections between transmission and engine conn_page.set_source_component('transmission') conn_page.set_target_component('engine') time.sleep(0.5) eq(conn_page.count_variable_figures(), 0) eq(conn_page.count_variable_connections(), 0) # reconnect transmission RPM to engine RPM conn_page.connect_vars('transmission.RPM', 'engine.RPM') time.sleep(1) eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['RPM', 'RPM']) # no connections between transmission and chassis conn_page.set_target_component('chassis') time.sleep(0.5) eq(conn_page.count_variable_figures(), 0) eq(conn_page.count_variable_connections(), 0) # reconnect transmission torque to chassis torque by dragging # conn_page.connect_vars('transmission.torque_ratio', 'chassis.torque_ratio') conn_page.show_all_variables() time.sleep(0.5) torque_vars = conn_page.find_variable_name('torque_ratio') eq(len(torque_vars), 2) chain = ActionChains(browser) chain.click_and_hold(torque_vars[0]) chain.move_to_element(torque_vars[1]) chain.release(on_element=None).perform() time.sleep(1.0) eq(conn_page.count_variable_connections(), 1) conn_page.show_connected_variables() time.sleep(0.5) eq(conn_page.count_variable_figures(), 2) eq(sorted(conn_page.get_variable_names()), ['torque_ratio', 'torque_ratio']) # no connections between vehicle assembly and transmission conn_page.set_source_component('') conn_page.set_target_component('transmission') time.sleep(0.5) eq(conn_page.count_variable_figures(), 0) eq(conn_page.count_variable_connections(), 0) # connect assembly variable to component variable conn_page.connect_vars('current_gear', 'transmission.current_gear') eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['current_gear', 'current_gear']) # one connection from chassis component to vehicle assembly conn_page.set_source_component('chassis') conn_page.set_target_component('') eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['acceleration', 'acceleration']) conn_page.close() # disconnect chassis chassis = workspace_page.get_dataflow_figure('chassis', 'sim.vehicle') chassis.disconnect() vehicle = workspace_page.get_dataflow_figure('vehicle', 'sim') conn_page = vehicle.connections_page() conn_page.move(-50, -100) eq(conn_page.count_variable_connections(), 0) # test invalid variable conn_page.connect_vars('chassis.acceleration', 'acceleration') message = NotifierPage.wait(workspace_page) eq(message, "Invalid source variable") # connect component variable to assembly variable conn_page.set_source_component('chassis') conn_page.connect_vars('chassis.acceleration', 'acceleration') eq(conn_page.count_variable_connections(), 1) conn_page.show_connected_variables() eq(sorted(conn_page.get_variable_names()), ['acceleration', 'acceleration']) conn_page.close() # Clean up. closeout(project_dict, workspace_page)
def _test_connect(browser): project_dict, workspace_page = startup(browser) # Import connect.py file_path = pkg_resources.resource_filename("openmdao.gui.test.functional", "files/connect.py") workspace_page.add_file(file_path) workspace_page.add_library_item_to_dataflow("connect.Topp", "top") # Connect components. workspace_page.show_dataflow("top") 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.move(-100, -100) eq(conn_page.dialog_title, "Connections: top") eq(conn_page.source_component, "comp1") eq(conn_page.target_component, "comp2") for prefix in ("b", "e", "f", "i", "s"): conn_page.connect_vars("comp1." + prefix + "_out", "comp2." + prefix + "_in") time.sleep(0.5) # Wait for display update. conn_page.close() # Set inputs (re-fetch required after updating). comp1 = workspace_page.get_dataflow_figure("comp1", "top") props = comp1.properties_page() props.move(0, -120) # Move up for short displays. time.sleep(0.5) # Wait for header update. eq(props.header, "Connectable: top.comp1") props.move(-100, -100) inputs = props.inputs eq(inputs[4].value, ["s_in", ""]) inputs[4][1] = "xyzzy" inputs = props.inputs eq(inputs[2].value, ["f_in", "0"]) inputs[2][1] = "2.781828" inputs = props.inputs eq(inputs[3].value, ["i_in", "0"]) inputs[3][1] = "42" inputs = props.inputs eq(inputs[0].value, ["b_in", "False"]) inputs.rows[0].cells[1].click() browser.find_element_by_xpath('//*[@id="bool-editor-b_in"]/option[1]').click() # inputs.rows[0].cells[0].click() # inputs[0][1] = 'True' inputs = props.inputs eq(inputs[1].value, ["e_in", "1"]) inputs.rows[1].cells[1].click() browser.find_element_by_xpath('//*[@id="editor-enum-e_in"]/option[3]').click() # inputs.rows[2].cells[0].click() # inputs[2][1] = '3' props.close() # Run the simulation. top = workspace_page.get_dataflow_figure("top") top.run() message = NotifierPage.wait(workspace_page) eq(message, "Run complete: success") # Verify outputs. comp2 = workspace_page.get_dataflow_figure("comp2", "top") editor = comp2.editor_page() editor.move(-100, 0) eq(editor.dialog_title, "Connectable: top.comp2") outputs = editor.get_outputs() expected = [ ["", "b_out", "True", "", ""], ["", "e_out", "3", "", ""], ["", "f_out", "2.781828", "", ""], ["", "i_out", "42", "", ""], ["", "s_out", "xyzzy", "", ""], [ "", "derivative_exec_count", "0", "", "Number of times this Component's derivative function has been executed.", ], ["", "exec_count", "1", "", "Number of times this Component has been executed."], ["", "itername", "1-2", "", "Iteration coordinates."], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) editor.close() # 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.lib.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.show_dataflow('top') time.sleep(1) # 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') 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) # We expect 2 notifiers: command complete and error. # These will likely overlap in a manner that 'Ok' is found but # later is hidden by the second notifier. try: # We expect 2 notifiers: command complete and error. NotifierPage.wait(workspace_page, base_id='command') except WebDriverException as exc: err = str(exc) if 'Element is not clickable' in err: err = NotifierPage.wait(workspace_page) NotifierPage.wait(workspace_page, base_id='command') else: err = NotifierPage.wait(workspace_page) if err != "NameError: name 'xyzzy' is not defined": raise AssertionError('Unexpected message: %r' % err) 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(projects_page, project_info_page, project_dict, workspace_page) closeout(project_dict, workspace_page)
def _test_replace(browser): # Replaces various connected components. project_dict, workspace_page = startup(browser) filename = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/rosen_suzuki.py') workspace_page.add_file(filename) # Replace 'top' with Simulation. top = workspace_page.get_dataflow_figure('top') top.remove() workspace_page.add_library_item_to_dataflow('rosen_suzuki.Simulation', 'top') # Show dataflow for Simulation. workspace_page.show_dataflow('top') workspace_page.hide_left() # Verify preproc is a PreProc. preproc = workspace_page.get_dataflow_figure('preproc', 'top') editor = preproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ [ 'directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', '' ], [ 'force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', '' ], ['x_in', 'ndarray', '[ 1. 1. 1. 1.]', '', 'true', '', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Replace preproc with a ScalingPreProc. workspace_page.replace('preproc', 'rosen_suzuki.ScalingPreProc') preproc = workspace_page.get_dataflow_figure('preproc', 'top') editor = preproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ [ 'directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', '' ], [ 'force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', '' ], ['scaler', 'float', '1', '', 'true', '', '', ''], ['x_in', 'ndarray', '[ 1. 1. 1. 1.]', '', 'true', '', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Verify postproc is a PostProc. postproc = workspace_page.get_dataflow_figure('postproc', 'top') editor = postproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ [ 'directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', '' ], [ 'force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', '' ], [ 'result_in', 'float', '0', '', 'false', '', "['parent.comp.result']", '' ], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Replace postproc with a ScalingPostProc. workspace_page.replace('postproc', 'rosen_suzuki.ScalingPostProc') postproc = workspace_page.get_dataflow_figure('postproc', 'top') editor = postproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ [ 'directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', '' ], [ 'force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', '' ], [ 'result_in', 'float', '0', '', 'false', '', "['parent.comp.result']", '' ], ['scaler', 'float', '1', '', 'true', '', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Verify driver is a CONMINdriver. driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, 0) inputs = editor.get_inputs() eq(inputs.value[0], [ 'cons_is_linear', 'ndarray', '[]', '', 'true', 'Array designating whether each constraint is linear.', '', '' ]) editor.close() # Replace driver with an SLSQPdriver. workspace_page.replace('driver', 'openmdao.lib.drivers.slsqpdriver.SLSQPdriver') driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, 0) inputs = editor.get_inputs() eq(inputs.value[0], [ 'accuracy', 'float', '0.000001', '', 'true', 'Convergence accuracy', '', '' ]) editor.close() # Verify comp is a OptRosenSuzukiComponent. comp = workspace_page.get_dataflow_figure('comp', 'top') editor = comp.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ [ 'directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', '' ], [ 'force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', '' ], [ 'x', 'ndarray', '[]', '', 'false', '', "['parent.preproc.x_out']", "['driver']" ], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Replace comp with an Assembly. workspace_page.replace('comp', 'openmdao.main.assembly.Assembly') args_page = ArgsPrompt(workspace_page.browser, workspace_page.port) args_page.click_ok() message = NotifierPage.wait(workspace_page) eq( message, "RuntimeError: top: Can't connect 'comp.result' to" " 'postproc.result_in': top: Can't find 'comp.result'") comp = workspace_page.get_dataflow_figure('comp', 'top') editor = comp.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ [ 'directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', '' ], [ 'force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', '' ], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Verify new figure. comp = workspace_page.get_dataflow_figure('comp', 'top') background = comp('top_right').value_of_css_property('background') assert background.find('circle-plus.png') >= 0 # Clean up. closeout(project_dict, workspace_page)
def _test_slot_subclass(browser): # test that a slot will accept subclasses project_dict, workspace_page = startup(browser) file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/slot_test.py') workspace_page.add_file(file_path) name = workspace_page.put_element_on_grid("AutoAssemb") aa = workspace_page.get_dataflow_figure(name) editor = aa.editor_page(double_click=False) editor.move(-200, 200) inputs = editor.get_inputs() expected = [ ['', 'input', '0', '', ''], [ '', 'directory', '', '', 'If non-blank, the directory to execute in.' ], [ '', 'force_execute', 'False', '', 'If True, always execute even if all IO traits are valid.' ], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) inputs[0][2] = "10" aa.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') outputs = editor.get_outputs() expected = [ ['', 'output', '80', '', ''], [ '', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed." ], [ '', 'exec_count', '1', '', 'Number of times this Component has been executed.' ], ['', 'itername', '', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) editor.show_slots() recorders_slot = find_slot_figure(workspace_page, 'd2', prefix=name) workspace_page.fill_slot_from_library(recorders_slot, 'Dummy2') aa.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') outputs = editor.get_outputs() expected = [ ['', 'output', '160', '', ''], [ '', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed." ], [ '', 'exec_count', '2', '', 'Number of times this Component has been executed.' ], ['', 'itername', '', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) # Clean up. closeout(project_dict, workspace_page)
def _test_connect(browser): project_dict, workspace_page = startup(browser) # Import connect.py file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/connect.py') workspace_page.add_file(file_path) workspace_page.add_library_item_to_dataflow('connect.Topp', 'top') # Connect components. workspace_page.show_dataflow('top') comp1 = workspace_page.get_dataflow_figure('comp1', 'top') comp2 = workspace_page.get_dataflow_figure('comp2', 'top') conn_page = workspace_page.connect(comp1, comp2) time.sleep(0.5) conn_page.move(-100, -100) eq(conn_page.dialog_title, 'Connections: top') eq(conn_page.source_component, 'comp1') eq(conn_page.target_component, 'comp2') for prefix in ('b', 'e', 'f', 'i', 's', 'w'): conn_page.connect_vars('comp1.' + prefix + '_out', 'comp2.' + prefix + '_in') time.sleep(0.5) # Wait for display update. conn_page.set_source_expression('comp1.f_out+comp1.i_out') conn_page.target_variable = 'comp2.x_in' conn_page.connect() time.sleep(0.5) # Wait for display update. eq(conn_page.count_variable_figures(), 21) eq(conn_page.count_variable_connections(), 9) # 3 connections for the expr conn_page.close() # Set inputs (re-fetch required after updating). comp1 = workspace_page.get_dataflow_figure('comp1', 'top') props = comp1.properties_page() props.move(0, -120) # Move up for short displays. time.sleep(0.5) # Wait for header update. eq(props.header, 'Connectable: top.comp1') props.move(-100, -100) inputs = props.inputs eq(inputs[4].value, ['s_in', '']) inputs[4][1] = 'xyzzy' inputs = props.inputs eq(inputs[2].value, ['f_in', '0']) inputs[2][1] = '2.781828' inputs = props.inputs eq(inputs[3].value, ['i_in', '0']) inputs[3][1] = '42' inputs = props.inputs eq(inputs[0].value, ['b_in', 'False']) inputs.rows[0].cells[1].click() browser.find_element_by_xpath( '//*[@id="bool-editor-b_in"]/option[1]').click() # inputs.rows[0].cells[0].click() # inputs[0][1] = 'True' inputs = props.inputs eq(inputs[1].value, ['e_in', '1']) inputs.rows[1].cells[1].click() browser.find_element_by_xpath( '//*[@id="editor-enum-e_in"]/option[3]').click() # inputs.rows[2].cells[0].click() # inputs[2][1] = '3' props.close() # Run the simulation. top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') # Verify outputs. comp2 = workspace_page.get_dataflow_figure('comp2', 'top') editor = comp2.editor_page() editor.move(-100, 0) eq(editor.dialog_title, 'Connectable: top.comp2') inputs = editor.get_inputs() for i, row in enumerate(inputs.value): if row[1] == 'w_in': eq(row[2], '5000') outputs = editor.get_outputs() expected = [ ['', 'b_out', 'True', '', ''], ['', 'e_out', '3', '', ''], ['', 'f_out', '2.781828', '', ''], ['', 'i_out', '42', '', ''], ['', 's_out', 'xyzzy', '', ''], ['', 'w_out', '5', 'kg', ''], ['', 'x_out', '44.781828', '', ''], [ '', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed." ], [ '', 'exec_count', '1', '', 'Number of times this Component has been executed.' ], ['', 'itername', '1-comp2', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) editor.close() # Clean up. closeout(project_dict, workspace_page)
def _test_connections(browser): # Check connection frame functionality. project_dict, workspace_page = startup(browser) filename = pkg_resources.resource_filename( 'openmdao.examples.enginedesign', 'vehicle_singlesim.py') workspace_page.add_file(filename) asm_name = 'sim' workspace_page.add_library_item_to_dataflow('vehicle_singlesim.VehicleSim', asm_name) # show dataflow for vehicle workspace_page.expand_object('sim') workspace_page.show_dataflow('sim.vehicle') workspace_page.hide_left() vehicle = workspace_page.get_dataflow_figure('vehicle', 'sim') # no connections between assembly vars conn_page = vehicle.connections_page() conn_page.move(-50, -100) eq(conn_page.dialog_title, 'Connections: vehicle') eq(conn_page.source_component, '-- Assembly --') eq(conn_page.target_component, '-- Assembly --') eq(conn_page.count_variable_connections(), 36) # two connections between engine and chassis conn_page.set_source_component('engine') conn_page.set_target_component('chassis') eq(conn_page.count_variable_figures(), 21) eq(conn_page.count_variable_connections(), 2) conn_page.show_connected_variables() time.sleep(0.5) eq(conn_page.count_variable_figures(), 4) eq(conn_page.count_variable_connections(), 2) eq(sorted(conn_page.get_variable_names()), ['engine_torque', 'engine_weight', 'mass_engine', 'torque']) # one connection between transmission and engine (RPM) conn_page.set_source_component('transmission') conn_page.set_target_component('engine') eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['RPM', 'RPM']) # disconnect transmission conn_page.close() # Sometimes obscures dataflow. tranny = workspace_page.get_dataflow_figure('transmission', 'sim.vehicle') tranny.disconnect() vehicle = workspace_page.get_dataflow_figure('vehicle', 'sim') conn_page = vehicle.connections_page() conn_page.move(-50, -100) conn_page.show_connected_variables() # now there are no connections between transmission and engine conn_page.set_source_component('transmission') conn_page.set_target_component('engine') time.sleep(0.5) eq(conn_page.count_variable_figures(), 0) eq(conn_page.count_variable_connections(), 0) # reconnect transmission RPM to engine RPM conn_page.connect_vars('transmission.RPM', 'engine.RPM') time.sleep(1) eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['RPM', 'RPM']) # no connections between transmission and chassis conn_page.set_target_component('chassis') time.sleep(0.5) eq(conn_page.count_variable_figures(), 0) eq(conn_page.count_variable_connections(), 0) # reconnect transmission torque to chassis torque by dragging # conn_page.connect_vars('transmission.torque_ratio', 'chassis.torque_ratio') conn_page.show_all_variables() time.sleep(0.5) torque_vars = conn_page.find_variable_name('torque_ratio') eq(len(torque_vars), 2) chain = ActionChains(browser) chain.click_and_hold(torque_vars[0]) chain.move_to_element(torque_vars[1]) chain.release(on_element=None).perform() time.sleep(1.0) eq(conn_page.count_variable_connections(), 1) conn_page.show_connected_variables() time.sleep(0.5) eq(conn_page.count_variable_figures(), 2) eq(sorted(conn_page.get_variable_names()), ['torque_ratio', 'torque_ratio']) # no connections between vehicle assembly and transmission conn_page.set_source_component('') conn_page.set_target_component('transmission') time.sleep(0.5) eq(conn_page.count_variable_figures(), 0) eq(conn_page.count_variable_connections(), 0) # connect assembly variable to component variable conn_page.connect_vars('current_gear', 'transmission.current_gear') eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['current_gear', 'current_gear']) # one connection from chassis component to vehicle assembly conn_page.set_source_component('chassis') conn_page.set_target_component('') eq(conn_page.count_variable_figures(), 2) eq(conn_page.count_variable_connections(), 1) eq(sorted(conn_page.get_variable_names()), ['acceleration', 'acceleration']) conn_page.close() # disconnect chassis chassis = workspace_page.get_dataflow_figure('chassis', 'sim.vehicle') chassis.disconnect() vehicle = workspace_page.get_dataflow_figure('vehicle', 'sim') conn_page = vehicle.connections_page() conn_page.move(-50, -100) eq(conn_page.count_variable_connections(), 18) # test invalid variable conn_page.connect_vars('chassis.accel', 'acceleration') message = NotifierPage.wait(workspace_page) eq(message, "Invalid source variable") # connect component variable to assembly variable conn_page.set_source_component('chassis') conn_page.connect_vars('chassis.acceleration', 'acceleration') eq(conn_page.count_variable_connections(), 1) conn_page.show_connected_variables() eq(sorted(conn_page.get_variable_names()), ['acceleration', 'acceleration']) conn_page.close() # 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_macro(browser): projects_page, project_info_page, 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.lib.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.show_dataflow('top') 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') 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) # We expect 2 notifiers: command complete and error. # These will likely overlap in a manner that 'Ok' is found but # later is hidden by the second notifier. try: # We expect 2 notifiers: command complete and error. msg = NotifierPage.wait(workspace_page, base_id='command') except WebDriverException as exc: if 'Element is not clickable' in str(exc): err = NotifierPage.wait(workspace_page) msg = NotifierPage.wait(workspace_page, base_id='command') else: err = NotifierPage.wait(workspace_page) if err != "NameError: name 'xyzzy' is not defined": raise AssertionError('Unexpected message: %r' % err) 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(projects_page, project_info_page, project_dict, workspace_page)
def _test_macro(browser): projects_page, project_info_page, 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.lib.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.show_dataflow("top") 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") 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) # We expect 2 notifiers: command complete and error. # These will likely overlap in a manner that 'Ok' is found but # later is hidden by the second notifier. try: # We expect 2 notifiers: command complete and error. msg = NotifierPage.wait(workspace_page, base_id="command") except WebDriverException as exc: if "Element is not clickable" in str(exc): err = NotifierPage.wait(workspace_page) msg = NotifierPage.wait(workspace_page, base_id="command") else: err = NotifierPage.wait(workspace_page) if err != "NameError: name 'xyzzy' is not defined": raise AssertionError("Unexpected message: %r" % err) 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(projects_page, project_info_page, project_dict, workspace_page)
def _test_slot_subclass(browser): # test that a slot will accept subclasses project_dict, workspace_page = startup(browser) file_path = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/slot_test.py') workspace_page.add_file(file_path) name = workspace_page.put_element_on_grid("AutoAssemb") aa = workspace_page.get_dataflow_figure(name) editor = aa.editor_page(double_click=False) editor.move(-200, 200) inputs = editor.get_inputs() expected = [ ['', 'input', '0', '', ''], [ '', 'directory', '', '', 'If non-blank, the directory to execute in.' ], [ '', 'excludes', '[]', '', 'Patterns for variables to exclude from the recorders' ' (only valid at top level).' ], [ '', 'force_fd', 'False', '', 'If True, always finite difference this component.' ], [ '', 'includes', "['*']", '', 'Patterns for variables to include in the recorders' ' (only valid at top level).' ], [ '', 'missing_deriv_policy', 'assume_zero', '', 'Determines behavior when some analytical derivatives are provided but' ' some are missing' ], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) inputs[0][2] = "10" aa.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') outputs = editor.get_outputs() expected = [ ['', 'output', '80', '', ''], [ '', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed." ], [ '', 'exec_count', '1', '', 'Number of times this Component has been executed.' ], ['', 'itername', '', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) editor.show_slots() recorders_slot = find_slot_figure(workspace_page, 'd2', prefix=name) workspace_page.fill_slot_from_library(recorders_slot, 'Dummy2') aa.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') outputs = editor.get_outputs() expected = [ ['', 'output', '160', '', ''], [ '', 'derivative_exec_count', '0', '', "Number of times this Component's derivative function has been executed." ], [ '', 'exec_count', '2', '', 'Number of times this Component has been executed.' ], ['', 'itername', '', '', 'Iteration coordinates.'], ] for i, row in enumerate(outputs.value): eq(row, expected[i]) # Clean up. closeout(project_dict, workspace_page)
def _test_MDAO_MDF(browser): # Build the MDF model as per the tutorial. project_dict, workspace_page = startup(browser) # Import the files that contain the disciplines file_path = pkg_resources.resource_filename('openmdao.lib.optproblems', 'sellar.py') workspace_page.add_file(file_path) # Add Disciplines to assembly. workspace_page.add_library_item_to_dataflow('openmdao.main.assembly.Assembly', 'top') workspace_page.show_dataflow('top') workspace_page.add_library_item_to_dataflow('sellar.Discipline1', 'dis1') workspace_page.add_library_item_to_dataflow('sellar.Discipline2', 'dis2') # Replace Run_Once with SLSQP workspace_page.replace_driver('top', 'SLSQPdriver') # Add Solver workspace_page.add_library_item_to_dataflow( 'openmdao.lib.drivers.iterate.FixedPointIterator', 'solver') # One data connection dis1 = workspace_page.get_dataflow_figure('dis1', 'top') dis2 = workspace_page.get_dataflow_figure('dis2', 'top') conn_page = workspace_page.connect(dis1, dis2) conn_page.move(-100, -100) conn_page.connect_vars('dis1.y1', 'dis2.y1') conn_page.close() # Add solver to optimizer workflow workspace_page.add_object_to_workflow('top.solver', 'top') # Add disciplines to solver workflow workspace_page.expand_object('top') workspace_page.add_object_to_workflow('top.dis1', 'top.solver') workspace_page.add_object_to_workflow('top.dis2', 'top.solver') workspace_page('dataflow_tab').click() # Configure Solver driver = workspace_page.get_dataflow_figure('solver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, -100) editor('parameters_tab').click() dialog = editor.new_parameter() dialog.target = 'dis1.y2' dialog.low = '-9.e99' dialog.high = '9.e99' dialog('ok').click() editor('constraints_tab').click() dialog = editor.new_constraint() dialog.expr = 'dis2.y2 - dis1.y2 = 0' dialog('ok').click() editor.close() # Configure Optimizer driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, -100) editor('parameters_tab').click() dialog = editor.new_parameter() dialog.target = 'dis1.z1,dis2.z1' dialog.low = '-10.0' dialog.high = '10.0' dialog('ok').click() dialog = editor.new_parameter() dialog.target = 'dis1.z2,dis2.z2' dialog.low = '0.0' dialog.high = '10.0' dialog('ok').click() dialog = editor.new_parameter() dialog.target = "dis1.x1" dialog.low = '0.0' dialog.high = '10.0' dialog('ok').click() editor('constraints_tab').click() dialog = editor.new_constraint() dialog.expr = '3.16 < dis1.y1' dialog('ok').click() dialog = editor.new_constraint() dialog.expr = 'dis2.y2 < 24.0' dialog('ok').click() editor('objectives_tab').click() dialog = editor.new_objective() dialog.expr = '(dis1.x1)**2 + dis1.z2 + dis1.y1 + math.exp(-dis2.y2)' dialog('ok').click() editor.close() # Get an implicitly connected output before the run. dis1_fig = workspace_page.get_dataflow_figure('dis1', 'top') editor = dis1_fig.editor_page() outputs = editor.get_outputs() eq(outputs.value[0][1:3], ['y1', '0']) editor.close() # Run the model top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') # Verify implicitly connected output has been updated with valid result. editor = dis1_fig.editor_page() outputs = editor.get_outputs() eq(outputs.value[0][1], 'y1') dis1_y1 = float(outputs.value[0][2]) if abs(dis1_y1 - 3.16) > 0.01: raise TestCase.failureException( "Output dis1.y1 did not reach correct value, but instead is %s" % dis1_y1) editor.close() # Check the objective workspace_page.do_command("top.dis1.z1") output1 = workspace_page.history.split("\n")[-1] workspace_page.do_command("top.dis1.z2") output2 = workspace_page.history.split("\n")[-1] if abs(float(output1) - 1.977657) > 0.01: raise TestCase.failureException( "Parameter z1 did not reach correct value, but instead is %s" % output1) if abs(float(output2) - 0.0) > 0.0001: raise TestCase.failureException( "Parameter z2 did not reach correct value, but instead is %s" % output2) # Clean up. closeout(project_dict, workspace_page)
def _test_MDAO_MDF(browser): # Build the MDF model as per the tutorial. project_dict, workspace_page = startup(browser) # Import the files that contain the disciplines file_path = pkg_resources.resource_filename('openmdao.lib.optproblems', 'sellar.py') workspace_page.add_file(file_path) # Add Disciplines to assembly. workspace_page.add_library_item_to_dataflow('openmdao.main.assembly.Assembly', 'top') workspace_page.show_dataflow('top') workspace_page.add_library_item_to_dataflow('sellar.Discipline1', 'dis1') workspace_page.add_library_item_to_dataflow('sellar.Discipline2', 'dis2') # Replace Run_Once with SLSQP workspace_page.replace_driver('top', 'SLSQPdriver') # Add Solver workspace_page.add_library_item_to_dataflow( 'openmdao.lib.drivers.iterate.FixedPointIterator', 'solver') # One data connection dis1 = workspace_page.get_dataflow_figure('dis1', 'top') dis2 = workspace_page.get_dataflow_figure('dis2', 'top') conn_page = workspace_page.connect(dis1, dis2) conn_page.move(-100, -100) conn_page.connect_vars('dis1.y1', 'dis2.y1') conn_page.close() # Add solver to optimizer workflow workspace_page.add_object_to_workflow('top.solver', 'top') # Add disciplines to solver workflow workspace_page.expand_object('top') workspace_page.add_object_to_workflow('top.dis1', 'top.solver') workspace_page.add_object_to_workflow('top.dis2', 'top.solver') workspace_page('dataflow_tab').click() # Configure Solver driver = workspace_page.get_dataflow_figure('solver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, -100) editor('inputs_tab').click() editor('parameters_tab').click() dialog = editor.new_parameter() dialog.target = 'dis1.y2' dialog.low = '-9.e99' dialog.high = '9.e99' dialog('ok').click() editor('constraints_tab').click() dialog = editor.new_constraint() dialog.expr = 'dis2.y2 = dis1.y2' dialog('ok').click() editor.close() # Configure Optimizer driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, -100) editor('parameters_tab').click() dialog = editor.new_parameter() dialog.target = 'dis1.z1,dis2.z1' dialog.low = '-10.0' dialog.high = '10.0' dialog('ok').click() dialog = editor.new_parameter() dialog.target = 'dis1.z2,dis2.z2' dialog.low = '0.0' dialog.high = '10.0' dialog('ok').click() dialog = editor.new_parameter() dialog.target = "dis1.x1" dialog.low = '0.0' dialog.high = '10.0' dialog('ok').click() editor('constraints_tab').click() dialog = editor.new_constraint() dialog.expr = '3.16 < dis1.y1' dialog('ok').click() dialog = editor.new_constraint() dialog.expr = 'dis2.y2 < 24.0' dialog('ok').click() editor('objectives_tab').click() dialog = editor.new_objective() dialog.expr = '(dis1.x1)**2 + dis1.z2 + dis1.y1 + math.exp(-dis2.y2)' dialog('ok').click() editor.close() # Set Initial Conditions workspace_page.do_command("top.dis1.z1 = top.dis2.z1 = 5.0") workspace_page.do_command("top.dis1.z2 = top.dis2.z2 = 2.0") workspace_page.do_command("top.dis1.x1 = 1.0") workspace_page.do_command("top.solver.tolerance = .00001") # Get an implicitly connected output before the run. dis1_fig = workspace_page.get_dataflow_figure('dis1', 'top') editor = dis1_fig.editor_page() outputs = editor.get_outputs() eq(outputs.value[0][1:3], ['y1', '0']) editor.close() # Run the model top = workspace_page.get_dataflow_figure('top') top.run() message = NotifierPage.wait(workspace_page) eq(message, 'Run complete: success') # Verify implicitly connected output has been updated with valid result. editor = dis1_fig.editor_page() outputs = editor.get_outputs() eq(outputs.value[0][1], 'y1') dis1_y1 = float(outputs.value[0][2]) if abs(dis1_y1 - 3.16) > 0.01: raise TestCase.failureException( "Output dis1.y1 did not reach correct value, but instead is %s" % dis1_y1) editor.close() # Check the objective workspace_page.do_command("top.dis1.z1") output1 = workspace_page.history.split("\n")[-1] workspace_page.do_command("top.dis1.z2") output2 = workspace_page.history.split("\n")[-1] if abs(float(output1) - 1.977657) > 0.01: raise TestCase.failureException( "Parameter z1 did not reach correct value, but instead is %s" % output1) if abs(float(output2) - 0.0) > 0.0001: raise TestCase.failureException( "Parameter z2 did not reach correct value, but instead is %s" % output2) # Clean up. closeout(project_dict, workspace_page)
def _test_replace(browser): # Replaces various connected components. project_dict, workspace_page = startup(browser) filename = pkg_resources.resource_filename('openmdao.gui.test.functional', 'files/rosen_suzuki.py') workspace_page.add_file(filename) # Replace 'top' with Simulation. top = workspace_page.get_dataflow_figure('top') top.remove() workspace_page.add_library_item_to_dataflow('rosen_suzuki.Simulation', 'top') # Show dataflow for Simulation. workspace_page.show_dataflow('top') workspace_page.hide_left() # Verify preproc is a PreProc. preproc = workspace_page.get_dataflow_figure('preproc', 'top') editor = preproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ ['directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', ''], ['force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', ''], ['x_in', 'ndarray', '[ 1. 1. 1. 1.]', '', 'true', '', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Replace preproc with a ScalingPreProc. workspace_page.replace('preproc', 'rosen_suzuki.ScalingPreProc') preproc = workspace_page.get_dataflow_figure('preproc', 'top') editor = preproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ ['directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', ''], ['force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', ''], ['scaler', 'float', '1', '', 'true', '', '', ''], ['x_in', 'ndarray', '[ 1. 1. 1. 1.]', '', 'true', '', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Verify postproc is a PostProc. postproc = workspace_page.get_dataflow_figure('postproc', 'top') editor = postproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ ['directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', ''], ['force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', ''], ['result_in', 'float', '0', '', 'false', '', "['parent.comp.result']", ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Replace postproc with a ScalingPostProc. workspace_page.replace('postproc', 'rosen_suzuki.ScalingPostProc') postproc = workspace_page.get_dataflow_figure('postproc', 'top') editor = postproc.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ ['directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', ''], ['force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', ''], ['result_in', 'float', '0', '', 'false', '', "['parent.comp.result']", ''], ['scaler', 'float', '1', '', 'true', '', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Verify driver is a CONMINdriver. driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, 0) inputs = editor.get_inputs() eq(inputs.value[0], ['cons_is_linear', 'ndarray', '[]', '', 'true', 'Array designating whether each constraint is linear.', '', '']) editor.close() # Replace driver with an SLSQPdriver. workspace_page.replace('driver', 'openmdao.lib.drivers.slsqpdriver.SLSQPdriver') driver = workspace_page.get_dataflow_figure('driver', 'top') editor = driver.editor_page(base_type='Driver') editor.move(-100, 0) inputs = editor.get_inputs() eq(inputs.value[0], ['accuracy', 'float', '0.000001', '', 'true', 'Convergence accuracy', '', '']) editor.close() # Verify comp is a OptRosenSuzukiComponent. comp = workspace_page.get_dataflow_figure('comp', 'top') editor = comp.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ ['directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', ''], ['force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', ''], ['x', 'ndarray', '[]', '', 'false', '', "['parent.preproc.x_out']", "['driver']"], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Replace comp with an Assembly. workspace_page.replace('comp', 'openmdao.main.assembly.Assembly') args_page = ArgsPrompt(workspace_page.browser, workspace_page.port) args_page.click_ok() message = NotifierPage.wait(workspace_page) eq(message, "RuntimeError: top: Can't connect 'comp.result' to" " 'postproc.result_in': top: Can't find 'comp.result'") comp = workspace_page.get_dataflow_figure('comp', 'top') editor = comp.editor_page() editor.move(-100, 0) inputs = editor.get_inputs() expected = [ ['directory', 'str', '', '', 'true', 'If non-blank, the directory to execute in.', '', ''], ['force_execute', 'bool', 'False', '', 'true', 'If True, always execute even if all IO traits are valid.', '', ''], ] for i, row in enumerate(inputs.value): eq(row, expected[i]) editor.close() # Verify new figure. comp = workspace_page.get_dataflow_figure('comp', 'top') background = comp('top_right').value_of_css_property('background') assert background.find('circle-plus.png') >= 0 # Clean up. closeout(project_dict, workspace_page)