#!/usr/bin/env python
# -*- coding: utf-8 -*-
#///////////////////////////////////////////////////////////////////////////////
#// Copyright (c) 2000-2019 Ericsson Telecom AB Telecom AB                               //
#//                                                                           //
#// All rights reserved. This program and the accompanying materials          //
#// are made available under the terms of the Eclipse Public License v2.0     //
#// which accompanies this distribution, and is available at                  //
#// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
#///////////////////////////////////////////////////////////////////////////////

from BaseTestCase import *
from Framework_CommonFunctions import *
from GuiEditor_CommonFunctions import *

class GuiEditor_SetupHandlingTests(BaseTestCase):

    def test_newSetup(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        newSetup(self.driver)
        setupName = getSetupName(self.driver)
        
        self.driver.implicitly_wait(0.5)
        
        self.assertEqual(setupName, "... unsaved setup ...", "Displayed setup name is incorrect, it is " + setupName + " and it should be: ... unsaved setup ...")
        self.assertFalse(treeExists(self.driver, "GuiEditor_RequestTree"), "The request tree exists, but it should not in a new setup")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewmodelEditor"), "There is a viewmodel editor, but there should be none in a new setup")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewEditor"), "There is a view editor, but there should be none in a new setup")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ImportEditor"), "There is an imports editor, but there should be none in a new setup")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_HtmlEditor"), "The html editor does not exists but it should")
        
        saveSetup(self.driver)
        self.assertTrue(dialogExists(self.driver, "SaveSetupAs"), "Save as dialog should have appeared after clicking the save button")

    def test_loadFromConfigAtStart(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        setupName = getSetupName(self.driver)
        
        self.driver.implicitly_wait(0.5)
        
        self.assertEqual(setupName, "Test1", "Displayed setup name is incorrect, it is " + setupName + " and it should be: Test1")
        self.assertTrue(treeExists(self.driver, "GuiEditor_HelpTree"), "There is no help tree, but it must always exist")
        self.assertTrue(treeExists(self.driver, "GuiEditor_RequestTree"), "There is no request tree, but there should be")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_ViewmodelEditor"), "There is no viewmodel editor, but there should be")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_ViewEditor"), "There is no view editor, but there should be")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ImportEditor"), "There is an import editor, but there should be none")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_HtmlEditor"), "The html editor does not exists but it should")

    def test_loadFromDialog(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        loadSetup(self.driver, "Test2")
        setupName = getSetupName(self.driver)
        
        self.driver.implicitly_wait(0.5)
        
        self.assertEqual(setupName, "Test2", "Displayed setup name is incorrect, it is " + setupName + " and it should be: Test2")
        self.assertTrue(treeExists(self.driver, "GuiEditor_HelpTree"), "There is no help tree, but it must always exist")
        self.assertTrue(treeExists(self.driver, "GuiEditor_RequestTree"), "There is no request tree, but there should be")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_ViewmodelEditor"), "There is no viewmodel editor, but there should be")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewEditor"), "There is a view editor, but there should not be")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ImportEditor"), "There is an import editor, but there should be none")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_HtmlEditor"), "The html editor does not exists but it should")

    def test_saveSetup(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        setupName = getSetupName(self.driver)
        viewmodelEditor = self.driver.find_element_by_id("GuiEditor_ViewmodelEditor_0")
        
        time.sleep(0.5)
        rightClickLabel(self.driver, "GuiEditor_ViewmodelEditor_0")
        time.sleep(0.5)
        if not clickInContextMenu(self.driver, "delete"):
            self.fail("No option for delete in context menu")
        time.sleep(0.5)
        
        saveSetup(self.driver)
        newSetup(self.driver)
        loadSetup(self.driver, setupName)
        
        try:
            viewmodelEditor = self.driver.find_element_by_id("GuiEditor_ViewmodelEditor_0")
            self.fail("Deleted ViewModel Editor is still present in the saved setup")
        except NoSuchElementException as e:
            pass

    def test_saveSetupAs(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        origSetupName = getSetupName(self.driver)
        
        newSetup(self.driver)
        newSetupName = 'tmp_setup'
        saveSetupAs(self.driver, newSetupName)
        setupName = getSetupName(self.driver)
        if not setupName == newSetupName: self.fail("Displayed setup name is incorrect, it is " + setupName + " and it should be: " + newSetupName)
        
        loadSetup(self.driver, origSetupName)
        loadSetup(self.driver, newSetupName)
        
        self.driver.implicitly_wait(0.5)
        
        self.assertFalse(treeExists(self.driver, "GuiEditor_RequestTree"), "The request tree exists, but it should not")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewmodelEditor"), "There is a viewmodel editor, but there should be none")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewEditor"), "There is a view editor, but there should be none")
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ImportEditor"), "There is an import editor, but there should be none")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_HtmlEditor"), "The html editor does not exists but it should")

    def test_saveSetupAsOverwrite(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        self.assertTrue(saveSetupAs(self.driver, "Test2", True, False), "SaveAs overwrite checking is not ok")

if __name__ == "__main__":
    unittest.main(catchbreak=True, verbosity=2)