"""
Some not terribly thorough tests for the interface to sp_ace.

This is mainly for building the parameter file; sp_ace itself is too
expensive in terms of computation and required external resources.
"""

import os
os.environ["GAVO_OOTTEST"] = "dontcare"

from gavo import api
from gavo import svcs
from gavo import utils
from gavo.helpers import testhelpers

RD = api.getRD("sp_ace/q")
modName = os.path.join(RD.resdir, "res/spacecore")
userModule, _ = utils.loadPythonModule(modName)


class ParFileTest(testhelpers.VerboseTest,
		metaclass=testhelpers.SamplesBasedAutoTest):

	def _runTest(self, sample):
		inArgs, pieces, notPieces = sample
		inArgs["spectrum"] = "(ignored)"
		inputTable = svcs.CoreArgs.fromRawArgs(
			RD.getById("c").getCoreFor("form", svcs.emptyQueryMeta).inputTable,
			inArgs)
		res = userModule.makeParFile(inputTable.getParamDict(), "/invalid/")
		for piece in pieces:
			self.assertTrue(piece in res, "%s missing"%piece)
		for piece in notPieces:
			self.assertFalse(piece in res, "Gratuitous %s"%piece)

	# this follows the sequence of keywords as given in the tutorial
	samples = [
		({}, ["wave_lims 4800 6860",
				"fwhm 0.400000",
				"norm_rad 30.000000"
			], [
				"error_est",
				"sn_ratio",
				"llist_rej",
				"T_force",
				"G_force",
				"ele2write"]),
		({"fwhm": "0.2"}, ["fwhm 0.2"], ["0.400"]),
		({"wave_lims": ["6000 6200"]}, ["wave_lims 6000 6200"], ["8400"]),
		({"snrforce": "30"}, ["sn_ratio 30"], []),
		({"compute_errors": "True"}, ["error_est"], []),
		({"tforce": "12000"}, ["T_force 12000"], []),
		({"gforce": "3.25"}, ["G_force 3.25"], []),
		({"norm_rad": "10.75"}, ["norm_rad 10.75"], ["30.0000"]),
		({"no_norm": "True"}, ["no_norm"], []),
		({"no_norm": "False"}, [], ["no_norm"]),
		({"alpha": "True"}, ["alpha"], []),
		({"alpha": "False"}, [], ["alpha"]),
		({"abd_loop": "True"}, ["ABD_loop"], []),
		({"abd_loop": "False"}, [], ["ABD_loop"]),

	]


if __name__=="__main__":
	testhelpers.main(ParFileTest)
