# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
from uitest.framework import UITestCase
from uitest.uihelper.common import type_text
from com.sun.star.awt.FontSlant import NONE as __Slant_NONE__
from com.sun.star.awt.FontSlant import ITALIC as __Slant_ITALIC__
from com.sun.star.awt.FontUnderline import NONE as __Underline_NONE__
from com.sun.star.awt.FontUnderline import SINGLE as __Underline_SINGLE__
from com.sun.star.awt.FontStrikeout import NONE as __Strikeout_NONE__
from com.sun.star.awt.FontStrikeout import SINGLE as __Strikeout_SINGLE__
class LibreLogoTest(UITestCase):
LIBRELOGO_PATH = "vnd.sun.star.script:LibreLogo|LibreLogo.py$%s?language=Python&location=share"
def createMasterScriptProviderFactory(self):
xServiceManager = self.xContext.ServiceManager
return xServiceManager.createInstanceWithContext(
"com.sun.star.script.provider.MasterScriptProviderFactory",
self.xContext)
def getScript(self, command):
xMasterScriptProviderFactory = self.createMasterScriptProviderFactory()
document = self.ui_test.get_component()
xScriptProvider = xMasterScriptProviderFactory.createScriptProvider(document)
xScript = xScriptProvider.getScript(self.LIBRELOGO_PATH %command)
self.assertIsNotNone(xScript, "xScript was not loaded")
return xScript
def logo(self, command):
self.xUITest.executeCommand(self.LIBRELOGO_PATH %command)
def test_librelogo(self):
with self.ui_test.create_doc_in_start_center("writer") as document:
xWriterDoc = self.xUITest.getTopFocusWindow()
xWriterEdit = xWriterDoc.getChild("writer_edit")
# to check the state of LibreLogo program execution
xIsAlive = self.getScript("__is_alive__")
# run a program with basic drawing commands FORWARD and RIGHT
# using their abbreviated names FD and RT
type_text(xWriterEdit, "fd 100 rt 45 fd 100")
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# check shape count for
# a) program running:
# - turtle shape: result of program start
# - line shape: result of turtle drawing
# b) continuous line drawing (the regression
# related to the fix of tdf#106792 resulted shorter line
# segments than the turtle path and non-continuous line
# drawing, ie. in this example, three line shapes
# instead of a single one. See its fix in
# commit 502e8785085f9e8b54ee383080442c2dcaf95b15)
self.assertEqual(document.DrawPage.getCount(), 2)
# check formatting by "magic wand"
self.logo("__translate__")
# a) check expansion of abbreviated commands : fd -> FORWARD, rt -> RIGHT,
# b) check line breaking (fix for tdf#100941: new line instead of the text "\" and "n")
self.assertEqual(document.Text.String.replace('\r\n', '\n'), "\nFORWARD 100 RIGHT 45 FORWARD 100")
# c) check usage of real paragraphs instead of line break (tdf#120422)
# first paragraph is empty (for working page break)
self.assertEqual(document.Text.createEnumeration().nextElement().String, "")
# function definitions and calls can be in arbitrary order
document.Text.String = """
; dragon curve
TO x n
IF n = 0 [ STOP ]
x n-1
RIGHT 90
y n-1 ; it worked only as "y(n-1)"
FORWARD 10
END
TO y n
IF n = 0 [ STOP ]
FORWARD 10
x n-1
LEFT 90
y n-1
END
PICTURE ; start new line draw
x 3 ; draw only a few levels
"""
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# new shape + previous two ones = 3
# disable unreliable test. Depending on how busy the machine is, this may produce 3 or 4
# self.assertEqual(document.DrawPage.getCount(), 3)
def check_label(self, hasCustomLock):
sLock = "CLEARSCREEN "
if hasCustomLock:
sLock = sLock + "SLEEP -1 "
with self.ui_test.create_doc_in_start_center("writer") as document:
xWriterDoc = self.xUITest.getTopFocusWindow()
xWriterEdit = xWriterDoc.getChild("writer_edit")
# to check the state of LibreLogo program execution
xIsAlive = self.getScript("__is_alive__")
#1 run a program with basic LABEL command
type_text(xWriterEdit, sLock + "LABEL 'Hello, World!'")
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# turtle and text shape
self.assertEqual(document.DrawPage.getCount(), 2)
textShape = document.DrawPage.getByIndex(1)
# text in the text shape
self.assertEqual(textShape.getString(), "Hello, World!")
#2 check italic, bold, underline + red and blue formatting
document.Text.String = sLock + "LABEL 'Hello, World!'"
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# turtle and text shape
self.assertEqual(document.DrawPage.getCount(), 2)
textShape = document.DrawPage.getByIndex(1)
# text in the text shape
self.assertEqual(textShape.getString(), "Hello, World!")
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
# before character "H"
self.assertEqual(c.CharPosture, __Slant_ITALIC__) # cursive
self.assertEqual(c.CharUnderline, __Underline_NONE__) # no underline
self.assertEqual(c.CharWeight, 100) # normal weight
self.assertEqual(c.CharColor, 0xFF0000) # red color
# after character " "
c.goRight(6, False)
self.assertEqual(c.CharPosture, __Slant_ITALIC__) # cursive
self.assertEqual(c.CharUnderline, __Underline_NONE__) # no underline
self.assertEqual(c.CharWeight, 100) # normal weight
self.assertEqual(c.CharColor, 0x000000) # black color
# after character "W"
c.goRight(2, False)
self.assertEqual(c.CharPosture, __Slant_ITALIC__) # cursive
self.assertEqual(c.CharUnderline, __Underline_NONE__) # no underline
self.assertEqual(c.CharWeight, 150) # bold
self.assertEqual(c.CharColor, 0x0000FF) # blue color
# 9th: after character "o"
c.goRight(1, False)
self.assertEqual(c.CharPosture, __Slant_ITALIC__) # cursive
self.assertEqual(c.CharUnderline, __Underline_SINGLE__) # underline
self.assertEqual(c.CharWeight, 150) # bold
self.assertEqual(c.CharColor, 0x0000FF) # blue color
# last: after character "!"
c.gotoEnd(False)
self.assertEqual(c.CharPosture, __Slant_ITALIC__) # cursive
self.assertEqual(c.CharUnderline, __Underline_SINGLE__) # underline
self.assertEqual(c.CharWeight, 100) # normal weight
self.assertEqual(c.CharColor, 0x000000) # black color
#2 check strike out, sub, sup, font name and font size formatting
document.Text.String = (
sLock + "FONTFAMILY 'Linux Biolinum G' FONTSIZE 12 " +
"LABEL 'x, x, x, " +
"x, " +
"x...'" )
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# turtle and text shape
self.assertEqual(document.DrawPage.getCount(), 2)
textShape = document.DrawPage.getByIndex(1)
# text in the text shape
self.assertEqual(textShape.getString(), "x, x, x, x, x...")
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
# strike out
self.assertEqual(c.CharStrikeout, __Strikeout_SINGLE__) # strike out
c.goRight(4, False)
# subscript
self.assertEqual(c.CharStrikeout, __Strikeout_NONE__) # no strike out
self.assertEqual(c.CharEscapement, -14000) # magic number for default subscript, see DFLT_ESC_AUTO_SUB
self.assertEqual(c.CharEscapementHeight, 58) # size in percent
c.goRight(3, False)
# superscript
self.assertEqual(c.CharEscapement, 14000) # magic number for default superscript, see DFLT_ESC_AUTO_SUPER
self.assertEqual(c.CharEscapementHeight, 58) # size in percent
c.goRight(3, False)
# font family
self.assertEqual(c.CharEscapement, 0) # no superscript
self.assertEqual(c.CharEscapementHeight, 100) # no superscript
self.assertEqual(c.CharFontName, "Liberation Sans") # new font family
c.goRight(3, False)
# font size
self.assertEqual(c.CharFontName, "Linux Biolinum G") # default font family
self.assertEqual(c.CharHeight, 20) # new font size
c.goRight(3, False)
# default font size
self.assertEqual(c.CharHeight, 12)
#3 check colors
document.Text.String = ( sLock +
"LABEL 'x, x, " + # check ignoring case
"x, " + # check with command
"x, " + # check with hexa code
"x, " + # blue text with orange highlighting
"x" + # blue text with purple highlighting
"...'" )
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# turtle and text shape
self.assertEqual(document.DrawPage.getCount(), 2)
textShape = document.DrawPage.getByIndex(1)
# text in the text shape
self.assertEqual(textShape.getString(), "x, x, x, x, x, x...")
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
self.assertEqual(c.CharColor, 0xFF0000) # red
self.assertEqual(c.CharBackColor, -1) # transparent highlight
c.goRight(4, False)
self.assertEqual(c.CharColor, 0x0000FF) # blue
self.assertEqual(c.CharBackColor, -1) # transparent highlight
c.goRight(3, False)
self.assertEqual(c.CharColor, 0x008000) # green
self.assertEqual(c.CharBackColor, -1) # transparent highlight
c.goRight(3, False)
self.assertEqual(c.CharColor, 0x0000FF) # blue
self.assertEqual(c.CharBackColor, -1) # transparent highlight
c.goRight(3, False)
self.assertEqual(c.CharColor, 0x0000FF) # blue
self.assertEqual(c.CharBackColor, 0xFFA500) # orange highlight
c.goRight(3, False)
self.assertEqual(c.CharColor, 0x0000FF) # blue
self.assertEqual(c.CharBackColor, 0xFF00FF) # purple highlight
c.goRight(3, False)
self.assertEqual(c.CharColor, 0x0000FF) # blue
self.assertEqual(c.CharBackColor, -1) # transparent highlight
#4 check font features
document.Text.String = (
sLock + "FONTFAMILY 'Linux Biolinum G' " +
"LABEL 'a smcp 11 11...'" )
self.logo("run")
# wait for LibreLogo program termination
while xIsAlive.invoke((), (), ())[0]:
pass
# turtle and text shape
self.assertEqual(document.DrawPage.getCount(), 2)
textShape = document.DrawPage.getByIndex(1)
# text in the text shape
self.assertEqual(textShape.getString(), "a smcp 11 11...")
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
# check portion formatting
c = textShape.createTextCursor()
c.gotoStart(False)
self.assertEqual(c.CharFontName, "Linux Biolinum G")
c.goRight(3, False)
self.assertEqual(c.CharFontName, "Linux Biolinum G:smcp")
c.goRight(5, False)
self.assertEqual(c.CharFontName, "Linux Biolinum G:smcp&pnum")
c.goRight(1, False)
self.assertEqual(c.CharFontName, "Linux Biolinum G:smcp&pnum&onum")
c.goRight(2, False)
self.assertEqual(c.CharFontName, "Linux Biolinum G:smcp&onum")
c.goRight(1, False)
self.assertEqual(c.CharFontName, "Linux Biolinum G:smcp")
def test_LABEL(self):
self.check_label(False)
def test_custom_lock(self):
self.check_label(True)
# vim: set shiftwidth=4 softtabstop=4 expandtab: