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

import re

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

from selenium.webdriver.common.alert import Alert
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.color import Color

class GuiEditor_EditorTests(BaseTestCase):

    def test_addEmptyRequest(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        newSetup(self.driver)
        
        addEmptyRequest(self.driver)
        self.assertTrue(editorTypeExists(self.driver, "JSONEditor"), "ElementEditor element not found after adding an empty request")
        
        closeButton = self.driver.wait.until(EC.element_to_be_clickable((By.ID, 'GuiEditor_ElementEditor_Close')))
        closeButton.click()
        
        self.assertTrue(treeExists(self.driver, "GuiEditor_RequestTree"), "There is no request tree, but there should be after adding an empty request")

    # ---------- adding editors ----------

    def test_addViewModel(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        newSetup(self.driver)
        
        addViewModel(self.driver, "CViewModel_DynamicTable")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_ViewmodelEditor"), "ViewmodelEditor element not found after adding one")

    def test_addView(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        newSetup(self.driver)
        
        addView(self.driver, "CView_ElementTable")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_ViewEditor"), "ViewEditor element not found after adding one")

    def test_addImport(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        newSetup(self.driver)
        
        addImport(self.driver, "Test2")
        self.assertTrue(editorTypeExists(self.driver, "GuiEditor_ImportEditor"), "ImportEditor element not found after adding one")

    # ---------- custom data editors ----------

    def test_validCustomData(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        
        editorId = "GuiEditor_ViewmodelEditor_0"
        openCustomDataEditor(self.driver, editorId)
        
        customData = '{"value":28}'
        script = "a = '" + customData + "';" + "view_editor = $('#GuiEditor_CustomDataEditor .CodeMirror')[0].CodeMirror; view_editor.setValue(a);"
        self.driver.execute_script(script)
        
        closeCustomDataEditor(self.driver)
        openCustomDataEditor(self.driver, editorId)
        
        script = "a = '" + customData + "';" + "view_editor = $('#GuiEditor_CustomDataEditor .CodeMirror')[0].CodeMirror; return view_editor.getValue();"
        textInEditor = self.driver.execute_script(script)
        # the editor formats the code, so we have to remove line breaks and spaces
        textInEditor = re.sub(r"\s", "", textInEditor)
        
        self.assertEqual(customData, textInEditor, "Custom data was not saved after closing the editor")

    def test_invalidCustomData(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        
        editorId = "GuiEditor_ViewmodelEditor_0"
        openCustomDataEditor(self.driver, editorId)
        
        customData = '{"value"28}'
        script = "a = '" + customData + "';" + "view_editor = $('#GuiEditor_CustomDataEditor .CodeMirror')[0].CodeMirror; view_editor.setValue(a);" 
        self.driver.execute_script(script)
        
        editorHeader = self.driver.find_element_by_id("GuiEditor_CustomDataEditor_Header")
        editorHeaderColor = editorHeader.value_of_css_property("color")
        self.assertEqual('#ff0000', str(Color.from_string(editorHeaderColor).hex), 'Custom data editor header should be red, it is ' + editorHeaderColor)

    # ---------- deleting editors ----------

    def test_delViewmodelEditor(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        
        rightClickLabel(self.driver, "GuiEditor_ViewmodelEditor_0")
        if not clickInContextMenu(self.driver, "delete"):
            self.fail("No option for delete in context menu of ViewmodelEditor")
        
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewmodelEditor"), "ViewmodelEditor element found after it was deleted")

    def test_delViewEditor(self):
        self.driver.get(self.HTML_FILE)
        startGuiEditor(self.driver)
        
        rightClickLabel(self.driver, "GuiEditor_ViewEditor_0")
        if not clickInContextMenu(self.driver, "delete"):
            self.fail("No option for delete in context menu of ViewEditor")
        
        self.assertFalse(editorTypeExists(self.driver, "GuiEditor_ViewEditor"), "ViewEditor element found after it was deleted")

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