#
# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Nokia Corporation - initial contribution.
#
# Contributors:
#
# Description: 
#

# Unit Test for the Raptor_cli (command line interface) module

import raptor_cli
import sys
import unittest
import os,subprocess
import re

class TestRaptorCli(unittest.TestCase):

	def setUp(self):
		sbsHome = os.environ["SBS_HOME"]
		self.windows = sys.platform.lower().startswith("win")
		
		self.doExportsOnly = False
		self.whatDir = sbsHome + "/test/simple"
		self.listconfig=[]
		self.bldinfvalue=[]
		self.makeoptions=[]
		self.sysdeflayers=[]
		self.sysdeforderlayers = True
		self.whatlist = []
		self.targets = []
		self.regexpwin = re.compile(r"^[A-Za-z]:\\",re.I)
		self.RunningQuiet = False
		self.allowCommandLineOverrides = True
		self.ignoreOsDetection = False
		self.filterList = "filter_terminal,filter_logfile"
		self.noDependInclude = False
		self.noDependGenerate = False
		
	def AddConfigName(self,configname):
		self.listconfig.append(configname)
		return True

	def AddConfigList(self,configlist):
		return True

	def AddSpecFile(self,specfilename):
		self.listspec.append(specfilename)
		return True

	def SetRoot(self,root):
		self.rootvalue = root
		return True
	
	def SetCheck(self,check):
		self.doCheck = check
		return True
	
	def SetWhat(self,what):
		self.doWhat = what
		return True
	
	def SetTries(self,tries):
		self.tries = tries
		return True
		
	def SetSysDefFile(self,sysdef):
		self.sysdefvalue = sysdef
		return True
			
	def SetSysDefBase(self,sysdefbase):
		self.sysdefbasevalue = sysdefbase
		return True

	def AddSysDefLayer(self,sysdeflayer):
		self.sysdeflayers.append(sysdeflayer)
		return True

	def SetSysDefOrderLayers(self,sysdeforderlayers):
		self.sysdeflayers = sysdeforderlayers
		return True

	def AddBuildInfoFile(self,bldinf):
		self.bldinfvalue.append(bldinf)
		return True

	def RunQuietly(self,QuietMode):
		self.RunningQuiet = QuietMode
		return True

	def SetTopMakefile(self,topmake):
		self.topmake = topmake
		return True
	
	def SetLogFileName(self, logfile):
		self.logFileName = logfile
		return True
		
	def SetMakeEngine(self, engine):
		self.makeEngine = engine
		return True
		
	def AddMakeOption(self, makeOption):
		self.makeOptions.append(makeOption)
		return True
			
	def SetDebugOutput(self, filename):
		return True
		
	def SetExportOnly(self, yesOrNo):
		self.doExportOnly = yesOrNo
		return True

	def SetNoExport(self, yesOrNo):
		self.doExport = not yesOrNo
		return True
	
	def SetKeepGoing(self, yesOrNo):
		return True
	
	def SetNoBuild(self, yesOrNo):
		return True
	
	def SetNoDependInclude(self, yesOrNo):
		self.noDependInclude = yesOrNo
		return True

	def SetNoDependGenerate(self, yesOrNo):
		self.noDependGenerate = yesOrNo
		return True
		
	def SetJobs(self, N):
		return True

	def SetToolCheck(self, toolcheck):
		return True
	
	def SetTiming(self, yesOrNo):
		return True

	def SetParallelParsing(self, onoroff):
		self.pp=onoroff
		return True

	def AddProject(self, project):
		return True

	def PrintVersion(self):
		return True
			 			 
	def Info(self, format, *extras):
		"Send an information message to the configured channel"
		if self.RunningQuiet==False:
			sys.stdout.write(("INFO: " + format + "\n") % extras)

	def Warn(self, format, *extras):
		"Send a warning message to the configured channel"
		sys.stdout.write(("WARNING: " + format + "\n") % extras)
		
	def IgnoreOsDetection(self, value):
		self.ignoreOsDetection = value
		return True
	
	def FilterList(self, value):
		self.filterList = value
		return True
	
	def AddSourceTarget(self, filename):
		self.targets.append(filename)
	
	def testDoRaptor(self):
		args = ['-c','config1',
				'-c','config name with spaces',
				'-s', 'wrong_file.xml',
				'--sysdef', 'system_definition.xml',
				'-a', 'wrong_base_dir',
				'--sysdefbase', 'C:\definitions',
				'-l', 'a_layer',
				'--layer', 'b_layer',
				'-b', 'bld1.inf',
				'--bldinf', 'bld2.inf',
				'-f', 'a_log_file.log',
				'-m', 'top.mk',
				'--makefile', '/home/Makefile',
				'--filters', 'filter_01,filter_02',
				'--export-only',
				'--source-target', 'some_source_file.cpp',
				'--source-target', 'some_resource_file.rss',
				'--pp', 'on',
				'--no-depend-include',
				'--no-depend-generate']
		
		raptor_cli.GetArgs(self,args)
		self.assertEqual(self.RunningQuiet,False)
		self.assertEqual(self.listconfig[0],'config1')
		self.assertEqual(self.listconfig[1],'config name with spaces')
		self.assertEqual(self.sysdefvalue,'system_definition.xml')
		self.assertEqual(self.sysdefbasevalue,'C:\\definitions')
		self.assertEqual(self.sysdeflayers[0],'a_layer')
		self.assertEqual(self.sysdeflayers[1],'b_layer')
		self.assertEqual(self.bldinfvalue[0],'bld1.inf')
		self.assertEqual(self.bldinfvalue[1],'bld2.inf')
		self.assertEqual(self.topmake,'/home/Makefile')
		self.assertEqual(self.logFileName,'a_log_file.log')
		self.assertEqual(self.filterList,'filter_01,filter_02')
		self.assertEqual(self.doExportOnly,True)
		self.assertEqual(self.targets[0], 'some_source_file.cpp')
		self.assertEqual(self.targets[1], 'some_resource_file.rss')
		self.assertEqual(self.pp, 'on')
		self.assertEqual(self.noDependInclude, True)
		self.assertEqual(self.noDependGenerate, True)

# run all the tests

from raptor_tests import SmokeTest

def run():
	t = SmokeTest()
	t.id = "999"
	t.name = "raptor_cli_unit"

	tests = unittest.makeSuite(TestRaptorCli)
	result = unittest.TextTestRunner(verbosity=2).run(tests)

	if result.wasSuccessful():
		t.result = SmokeTest.PASS
	else:
		t.result = SmokeTest.FAIL

	return t
