summaryrefslogtreecommitdiff
path: root/libs/assimp/test/regression/ai_regression_ui.py
diff options
context:
space:
mode:
Diffstat (limited to 'libs/assimp/test/regression/ai_regression_ui.py')
-rw-r--r--libs/assimp/test/regression/ai_regression_ui.py293
1 files changed, 293 insertions, 0 deletions
diff --git a/libs/assimp/test/regression/ai_regression_ui.py b/libs/assimp/test/regression/ai_regression_ui.py
new file mode 100644
index 0000000..30c9b68
--- /dev/null
+++ b/libs/assimp/test/regression/ai_regression_ui.py
@@ -0,0 +1,293 @@
+#!/usr/bin/env python3
+# -*- Coding: UTF-8 -*-
+
+# ---------------------------------------------------------------------------
+# Open Asset Import Library (ASSIMP)
+# ---------------------------------------------------------------------------
+#
+# Copyright (c) 2006-2020, ASSIMP Development Team
+#
+# All rights reserved.
+#
+# Redistribution and use of this software in source and binary forms,
+# with or without modification, are permitted provided that the following
+# conditions are met:
+#
+# * Redistributions of source code must retain the above
+# copyright notice, this list of conditions and the
+# following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the
+# following disclaimer in the documentation and/or other
+# materials provided with the distribution.
+#
+# * Neither the name of the ASSIMP team, nor the names of its
+# contributors may be used to endorse or promote products
+# derived from this software without specific prior
+# written permission of the ASSIMP Development Team.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# ---------------------------------------------------------------------------
+from tkinter import *
+import sys
+import os
+import platform
+import run
+import subprocess
+import result_checker as rc
+
+INFO = 0
+WARN = 1
+ERROR = 2
+
+# -------------------------------------------------------------------------------
+def log( sev, msg ):
+ """
+ This function is used to log info, warnings and errors.
+ """
+ logEntry = ""
+ if sev == 0:
+ logEntry = logEntry + "[INFO]: "
+ elif sev == 1:
+ logEntry = logEntry + "[WARN]: "
+ elif sev == 2:
+ logEntry = logEntry + "[ERR] : "
+ logEntry = logEntry + str( msg )
+ print( logEntry )
+
+# -------------------------------------------------------------------------------
+class BaseDialog( Toplevel ):
+ """
+ Helper base class for dialogs used in the UI.
+ """
+
+ def __init__(self, parent, title = None, buttons=""):
+ """
+ Constructor
+ """
+ Toplevel.__init__( self, parent )
+ self.transient(parent)
+
+ if title:
+ self.title(title)
+
+ self.parent = parent
+ self.result = None
+ body = Frame(self)
+ self.initial_focus = self.body(body)
+ body.pack(padx=5, pady=5)
+ self.buttonbox(buttons)
+ self.grab_set()
+ if not self.initial_focus:
+ self.initial_focus = self
+ self.protocol("WM_DELETE_WINDOW", self.cancel)
+ self.geometry("+%d+%d" % (parent.winfo_rootx() + 50,
+ parent.winfo_rooty() + 50))
+ self.initial_focus.focus_set()
+ self.wait_window(self)
+
+ def body(self, master):
+ # create dialog body. return widget that should have
+ # initial focus. this method should be overridden
+ pass
+
+ def buttonbox(self, buttons):
+ # add standard button box. override if you don't want the
+ # standard buttons
+ box = Frame(self)
+ w = Button(box, text="OK", width=40, command=self.ok, default=ACTIVE)
+ w.pack(side=LEFT, padx=5, pady=5)
+ self.bind("<Return>", self.ok)
+ box.pack()
+
+ def ok(self, event=None):
+ if not self.validate():
+ self.initial_focus.focus_set() # put focus back
+ return
+
+ self.withdraw()
+ self.update_idletasks()
+ self.apply()
+ self.cancel()
+
+ def cancel(self, event=None):
+ # put focus back to the parent window
+ self.parent.focus_set()
+ self.destroy()
+
+ def validate(self):
+ return 1 # override
+
+ def apply(self):
+ pass # override
+
+# -------------------------------------------------------------------------------
+class VersionDialog( BaseDialog ):
+ """
+ This class is used to create the info dialog.
+ """
+ def body(self, master):
+ # info will be read from assimp command line tool
+ version = "Asset importer lib version unknown"
+ exe = run.getEnvVar( "assimp_path" )
+ if len( exe ) != 0:
+ command = [exe, "version" ]
+ log( INFO, "command = " + str(command))
+ stdout = subprocess.check_output(command)
+ for line in stdout.splitlines():
+ pos = str(line).find( "Version" )
+ if -1 != pos:
+ version = line
+ Label(master, text=version).pack()
+
+ def apply(self):
+ pass
+
+# -------------------------------------------------------------------------------
+class SetupDialog( BaseDialog ):
+ """
+ This class is used to create the setup dialog.
+ """
+ def body(self, master):
+ Label(master, justify=LEFT, text="Assimp: " ).grid(row=0, column=0)
+ Label(master, justify=LEFT, text=run.getEnvVar("assimp_path")).grid(row=0, column=1)
+ Label(master, text="New executable:").grid(row=1)
+ self.e1 = Entry(master)
+ self.e1.grid(row=1, column=1)
+ return self.e1 # initial focus
+
+ def apply(self):
+ exe = str( self.e1.get() )
+ if len( exe ) == 0:
+ return 0
+ if os.path.isfile( exe ):
+ log( INFO, "Set executable at " + exe)
+ self.assimp_bin_path = exe
+ run.setEnvVar("assimp_path", self.assimp_bin_path)
+ else:
+ log( ERROR, "Executable not found at "+exe )
+ return 0
+
+# -------------------------------------------------------------------------------
+class RegDialog( object ):
+ """
+ This class is used to create a simplified user interface for running the regression test suite.
+ """
+
+ def __init__(self, bin_path ):
+ """
+ Constructs the dialog, you can define which executable shal be used.
+ @param bin_path [in] Path to assimp binary.
+ """
+ run.setEnvVar( "assimp_path", bin_path )
+ self.b_run_ = None
+ self.b_update_ = None
+ self.b_res_checker_ = None
+ self.b_quit_ = None
+ if platform.system() == "Windows":
+ self.editor = "notepad"
+ elif platform.system() == "Linux":
+ self.editor = "vim"
+ self.root = None
+ self.width=40
+
+ def run_reg(self):
+ log(INFO, "Starting regression test suite.")
+ run.run_test()
+ rc.run()
+ self.b_update_.config( state=ACTIVE )
+ return 0
+
+ def reg_update(self):
+ assimp_exe = run.getEnvVar( "assimp_path" )
+ if len( assimp_exe ) == 0:
+ return 1
+ exe = "python"
+ command = [ exe, "gen_db.py", assimp_exe ]
+ log(INFO, "command = " + str(command))
+ stdout = subprocess.call(command)
+
+ log(INFO, stdout)
+ return 0
+
+ def shop_diff( self ):
+ log(WARN, "ToDo!")
+ return 0
+
+ def open_log(self):
+ command = [ self.editor, "../results/run_regression_suite_output.txt", ]
+ log(INFO, "command = " + str( command ) )
+ r = subprocess.call(command)
+ return 0
+
+ def show_version( self ):
+ d = VersionDialog( self.root )
+ return 0
+
+ def setup(self):
+ d = SetupDialog( self.root )
+ return 0
+
+ def quit(self):
+ log( INFO, "quit" )
+ sys.exit( 0 )
+
+ def initUi(self):
+ # create the frame with buttons
+ self.root = Tk()
+ self.root.title( "Assimp-Regression UI")
+ self.b_run_ = Button( self.root, text="Run regression ", command=self.run_reg, width = self.width )
+ self.b_update_ = Button( self.root, text="Update database", command=self.reg_update, width = self.width )
+ self.b_show_diff_ = Button( self.root, text="Show diff", command=self.shop_diff, width = self.width )
+ self.b_log_ = Button( self.root, text="Open log", command=self.open_log, width = self.width )
+ self.b_setup_ = Button( self.root, text="Setup", command=self.setup, width = self.width )
+ self.b_version_ = Button( self.root, text="Show version", command=self.show_version, width = self.width )
+ self.b_quit_ = Button( self.root, text="Quit", command=self.quit, width = self.width )
+
+ # define the used grid
+ self.b_run_.grid( row=0, column=0, sticky=W+E )
+ self.b_update_.grid( row=1, column=0, sticky=W+E )
+ self.b_show_diff_.grid( row=2, column=0, sticky=W+E )
+ self.b_log_.grid( row=3, column=0, sticky=W+E )
+ self.b_setup_.grid( row=4, column=0, sticky=W+E )
+ self.b_version_.grid( row=5, column=0, sticky=W+E )
+ self.b_quit_.grid( row=6, column=0, sticky=W+E )
+
+ #self.b_update_.config( state=DISABLED )
+ self.b_show_diff_.config( state=DISABLED )
+
+ # run mainloop
+ self.root.mainloop()
+
+# -------------------------------------------------------------------------------
+def getDefaultExecutable():
+ assimp_bin_path = ""
+ if platform.system() == "Windows":
+ assimp_bin_path = '..\\..\\bin\\debug\\assimpd.exe'
+ elif platform.system() == "Linux":
+ assimp_bin_path = '../../bin/assimp'
+
+ return assimp_bin_path
+
+# -------------------------------------------------------------------------------
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ assimp_bin_path = sys.argv[1]
+ else:
+ assimp_bin_path = getDefaultExecutable()
+ log( INFO, 'Using assimp binary: ' + assimp_bin_path )
+ dlg = RegDialog(assimp_bin_path)
+ dlg.initUi()
+
+# vim: ai ts=4 sts=4 et sw=4