Index: framspy/FramsticksLib.py
===================================================================
--- framspy/FramsticksLib.py	(revision 1202)
+++ framspy/FramsticksLib.py	(revision 1203)
@@ -49,11 +49,10 @@
 		print()
 
-		print('Performing a basic test 1/2... ', end='')
 		simplest = self.getSimplest("1")
-		assert simplest == "X" and type(simplest) is str
-		print('OK.')
-		print('Performing a basic test 2/2... ', end='')
-		assert self.isValid(["X[0:0],", "X[0:0]", "X[1:0]"]) == [False, True, False]
-		print('OK.')
+		if not (simplest == "X" and type(simplest) is str):
+			raise RuntimeError('Failed getSimplest() test.')
+		if not (self.isValid(["X[0:0],", "X[0:0]", "X[1:0]"]) == [False, True, False]):
+			raise RuntimeError('Failed isValid() test.')
+
 		if not self.DETERMINISTIC:
 			frams.Math.randomize()
@@ -61,15 +60,17 @@
 		if sim_settings_files is not None:
 			self.EVALUATION_SETTINGS_FILE = sim_settings_files # overwrite defaults
-		print('Using settings:', self.EVALUATION_SETTINGS_FILE)
-		assert isinstance(self.EVALUATION_SETTINGS_FILE, list)  # ensure settings file(s) are provided as a list
-		
+		print('Basic tests OK. Using settings:', self.EVALUATION_SETTINGS_FILE)
+		print()
+		if not isinstance(self.EVALUATION_SETTINGS_FILE, list):  # ensure settings file(s) are provided as a list
+			raise ValueError("Evaluation settings file(s) '%s' should be provided as a list" % self.EVALUATION_SETTINGS_FILE)
+
 		for simfile in self.EVALUATION_SETTINGS_FILE:
 			ec = frams.MessageCatcher.new()  # catch potential errors, warnings, messages - just to detect if there are ERRORs
-			ec.store = 2; # store all, because they are caught by MessageCatcher and will not appear on console (which we want)
+			ec.store = 2;  # store all, because they are caught by MessageCatcher and will not appear in output (which we want)
 			frams.Simulator.ximport(simfile, 4 + 8 + 16)
 			ec.close()
-			print(ec.messages) # output all caught messages
+			print(ec.messages)  # output all caught messages
 			if ec.error_count._value() > 0:
-				raise ValueError("Problem while importing file '%s'" % simfile) # make missing files or incorrect paths fatal because error messages are easy to overlook in output, and these errors would not prevent Framsticks simulator from performing genetic operations, starting and running in evaluate()
+				raise ValueError("Problem while importing file '%s'" % simfile)  # make missing files or incorrect paths fatal because error messages are easy to overlook in output, and these errors would not prevent Framsticks simulator from performing genetic operations, starting and running in evaluate()
 
 
@@ -89,5 +90,5 @@
 		if not self.PRINT_FRAMSTICKS_OUTPUT:
 			ec = frams.MessageCatcher.new()  # mute potential errors, warnings, messages
-			ec.store = 2; # store all, because they are caught by MessageCatcher and will not appear on console
+			ec.store = 2;  # store all, because they are caught by MessageCatcher and will not appear in output
 
 		frams.GenePools[0].clear()
@@ -110,6 +111,6 @@
 			ec.close()
 			if ec.error_count._value() > 0:
-				print(ec.messages) # if errors occurred, output all caught messages for debugging
-				raise RuntimeError("[ERROR] %d error(s) and %d warning(s) while evaluating %d genotype(s)" % (ec.error_count._value(), ec.warning_count._value()-ec.error_count._value(), len(genotype_list))) # make errors fatal; by default they stop the simulation anyway so let's not use potentially incorrect or partial results and fix the cause first.
+				print(ec.messages)  # if errors occurred, output all caught messages for debugging
+				raise RuntimeError("[ERROR] %d error(s) and %d warning(s) while evaluating %d genotype(s)" % (ec.error_count._value(), ec.warning_count._value() - ec.error_count._value(), len(genotype_list)))  # make errors fatal; by default they stop the simulation anyway so let's not use potentially incorrect or partial results and fix the cause first.
 
 		results = []
@@ -134,5 +135,6 @@
 		for g in genotype_list:
 			mutated.append(frams.GenMan.mutate(frams.Geno.newFromString(g)).genotype._string())
-		assert len(genotype_list) == len(mutated), "Submitted %d genotypes, received %d validity values" % (len(genotype_list), len(mutated))
+		if len(genotype_list) != len(mutated):
+			raise RuntimeError("Submitted %d genotypes, received %d mutants" % (len(genotype_list), len(mutated)))
 		return mutated
 
@@ -197,9 +199,13 @@
 
 	def isValid(self, genotype_list: List[str]) -> List[bool]:
+		"""
+		:returns: genetic validity (i.e., not based on trying to build creatures from provided genotypes). For a more thorough check, see isValidCreature().
+		"""
 		assert isinstance(genotype_list, list)  # because in python, str has similar capabilities as list and here it would pretend to work too, so to avoid any ambiguity
 		valid = []
 		for g in genotype_list:
 			valid.append(frams.Geno.newFromString(g).is_valid._int() == 1)
-		assert len(genotype_list) == len(valid), "Tested %d genotypes, received %d validity values" % (len(genotype_list), len(valid))
+		if len(genotype_list) != len(valid):
+			raise RuntimeError("Tested %d genotypes, received %d validity values" % (len(genotype_list), len(valid)))
 		return valid
 
@@ -246,3 +252,3 @@
 	print('\tDissimilarity of Parent1 and Offspring:', framsLib.dissimilarity([parent1, offspring], 1)[0, 1])
 	print('\tPerformance of Offspring:', framsLib.evaluate([offspring]))
-	print('\tValidity of Parent1, Parent 2, and Offspring:', framsLib.isValid([parent1, parent2, offspring]))
+	print('\tValidity (genetic) of Parent1, Parent 2, and Offspring:', framsLib.isValid([parent1, parent2, offspring]))
