Source code for jasy.test.style.variables

#!/usr/bin/env python3

import sys
import os
import unittest
import logging
import inspect

# Extend PYTHONPATH with local 'lib' folder
if __name__ == "__main__":
    jasyroot = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir, os.pardir, os.pardir))
    sys.path.insert(0, jasyroot)
    print("Running from %s..." % jasyroot)

import jasy.style.Engine as Engine

"""
SUPPORTS

$width = 300px;
$height = $width * .5;
$width = 300px, $height = 200px;
$width += 20px;
$content = "Hello" + "World";
$negative = -100px;
$list = 20px 30px;
$listoper = $list * 20;

"""


[docs]class Tests(unittest.TestCase):
[docs] def process(self, code): callerName = inspect.stack()[1][3][5:] tree = Engine.getTree(code, callerName) tree = Engine.reduceTree(tree) return Engine.compressTree(tree)
[docs] def test_unused(self): self.assertEqual(self.process(''' $width = 300px; '''), '')
[docs] def test_condition_redefine(self): self.assertEqual(self.process(''' $width = 300px; @if $width > 200{ $width = 200px; } h1{ width: $width; } '''), 'h1{width:200px;}')
[docs] def test_condition_strcomp(self): self.assertEqual(self.process(''' $color = "red"; @if $color == "red"{ $bg = "white"; } @else { $bg = "black"; } h1{ color: $color; background-color: $bg; } '''), 'h1{color:"red";background-color:"white";}')
[docs] def test_condition_redefine_deep(self): self.assertEqual(self.process(''' $width = 301px; @if $width > 200{ @if $width % 2 == 0{ $width = 200px; } @else { $width = 199px; } } h1{ width: $width; } '''), 'h1{width:199px;}')
[docs] def test_condition_redefine_override(self): self.assertEqual(self.process(''' $width = 300px; @if $width > 200{ $width = 200px; } $width = 100px; h1{ width: $width; } '''), 'h1{width:100px;}')
[docs] def test_condition_define_new(self): self.assertEqual(self.process(''' $width = 300px; @if $width > 200{ $height = $width / 2; } @else { $height = $width * 2; } h1{ width: $width; height: $height; } '''), 'h1{width:300px;height:150px;}')
[docs] def test_condition_define_new_override(self): self.assertEqual(self.process(''' $width = 300px; @if $width > 200{ $height = $width / 2; } @else { $height = $width * 2; } $width = 75px; h1{ width: $width; height: $height; } '''), 'h1{width:75px;height:150px;}')
[docs] def test_unused_operation(self): self.assertEqual(self.process(''' $width = 300px; $height = 200px; $size = $width * $height; '''), '')
[docs] def test_value_simple(self): self.assertEqual(self.process(''' $width = 300px; $height = 200px; .box{ width: $width; height: $height; } '''), '.box{width:300px;height:200px;}')
[docs] def test_value_simple_scope(self): self.assertEqual(self.process(''' $width = 300px; $height = 200px; .box{ $width = 40px; $height = 20px; width: $width; height: $height; } header{ width: $width; height: $height; } '''), '.box{width:40px;height:20px;}header{width:300px;height:200px;}')
[docs] def test_value_simple_namespaced(self): self.assertEqual(self.process(''' $box.width = 300px; $box.height = 200px; .box{ width: $box.width; height: $box.height; } '''), '.box{width:300px;height:200px;}')
[docs] def test_value_simple_multi(self): self.assertEqual(self.process(''' $width = 300px, $height = 200px; .box{ width: $width; height: $height; } '''), '.box{width:300px;height:200px;}')
[docs] def test_value_simple_math(self): self.assertEqual(self.process(''' $width = 300px; $height = 200px; .box{ $padding = 10px; padding: $padding; width: @expr($width - $padding * 2); height: @expr($height - $padding * 2); } '''), '.box{padding:10px;width:280px;height:180px;}')
[docs] def test_define_override(self): self.assertEqual(self.process(''' $width = 300px; $width = 400px; .box{ width: $width; } '''), '.box{width:400px;}')
[docs] def test_define_unary(self): self.assertEqual(self.process(''' $negative = -100px; .box{ left: $negative; } '''), '.box{left:-100px;}')
[docs] def test_define_color_hex(self): self.assertEqual(self.process(''' $hex = #39FC20; .box{ color: $hex; } '''), '.box{color:#39FC20;}')
[docs] def test_define_color_hex3(self): self.assertEqual(self.process(''' $hex = #3F2; .box{ color: $hex; } '''), '.box{color:#3F2;}')
[docs] def test_define_color_rgb(self): self.assertEqual(self.process(''' $rgb = rgb(200, 100, 50); .box{ color: $rgb; } '''), '.box{color:rgb(200,100,50);}')
[docs] def test_define_multi(self): self.assertEqual(self.process(''' $inner = 20px 10px; .box{ padding: $inner; } '''), '.box{padding:20px 10px;}')
[docs] def test_define_multi_plus_operation_decl(self): self.assertEqual(self.process(''' $inner = 20px * 3 10px * 2; .box{ padding: $inner; } '''), '.box{padding:60px 20px;}')
[docs] def test_define_multi_mutation_end(self): self.assertEqual(self.process(''' $inner = 20px 10px; .box{ padding: @expr($inner * 2); } '''), '.box{padding:40px 20px;}')
[docs] def test_define_multi_mutation_begin(self): self.assertEqual(self.process(''' $inner = 20px 10px; .box{ padding: @expr(.5 * $inner); } '''), '.box{padding:10px 5px;}')
[docs] def test_define_multi_mutation_plex(self): self.assertEqual(self.process(''' $inner = 20px 10px; $outer = 2 3; .box{ padding: @expr($inner * $outer); } '''), '.box{padding:40px 30px;}')
[docs] def test_define_assignop_plus(self): self.assertEqual(self.process(''' $width = 300px; $width += 53; .box{ width: $width; } '''), '.box{width:353px;}')
[docs] def test_define_assignop_multi(self): self.assertEqual(self.process(''' $width = 20px; $columns = 12; $width *= $columns; .box{ width: $width; } '''), '.box{width:240px;}')
[docs] def test_math_operation(self): self.assertEqual(self.process(''' $width = 300px; $width = $width * 1.3; $width *= .5 + .213; .box{ width: $width; } '''), '.box{width:278.07px;}')
[docs] def test_math_operation_percent(self): self.assertEqual(self.process(''' $columns = 12; $width = 100% / $columns; $pxwidth = 960px * $width; .box{ width: $width; height: $pxwidth; } '''), '.box{width:8.3333%;height:80px;}')
[docs] def test_string_operation(self): self.assertEqual(self.process(''' $text = "Hello {{name}}."; $text += "Welcome to my site!"; $text = "<p>" + $text + "</p>"; .box{ content: $text; } '''), '.box{content:"<p>Hello {{name}}.Welcome to my site!</p>";}')
[docs] def test_mixed_operation(self): self.assertEqual(self.process(''' $text = "Hello "; $text += 42; .box{ content: $text; } '''), '.box{content:"Hello 42";}')
[docs] def test_nonequal(self): self.assertEqual(self.process(''' $freeuser = true; $enabled = !$freeuser; .box{ content: $enabled; } '''), '.box{content:false;}')
[docs] def test_nonequal_combined(self): self.assertEqual(self.process(''' $freeuser = true; $enabled = $freeuser && !false; .box{ content: $enabled; } '''), '.box{content:true;}')
[docs] def test_nonequal_combined_human(self): self.assertEqual(self.process(''' $freeuser = true; $enabled = $freeuser and not false; .box{ content: $enabled; } '''), '.box{content:true;}')
[docs] def test_nonequal_combined_parens(self): self.assertEqual(self.process(''' $freeuser = true; $enabled = $freeuser && (!false and true); .box{ content: $enabled; } '''), '.box{content:true;}')
[docs] def test_value_operator_math(self): self.assertEqual(self.process(''' $base = 30px; $larger = $base * 1.3; $smaller = $base * 0.6; $reallysmall = $smaller - 10; // snap $larger = $larger - $larger % 5; h1{ font-size: $larger; } p{ font-size: $base; } small{ font-size: $smaller; } footer{ font-size: $reallysmall; } '''), 'h1{font-size:35px;}p{font-size:30px;}small{font-size:18px;}footer{font-size:8px;}')
[docs] def test_default_available(self): self.assertEqual(self.process(''' $width = 300px; $width ?= 400px; .box{ width: $width; } '''), '.box{width:300px;}')
[docs] def test_default_new(self): self.assertEqual(self.process(''' $width ?= 400px; .box{ width: $width; } '''), '.box{width:400px;}')
[docs] def test_variable_usedonly_in_selector(self): self.assertEqual(self.process(''' $align = left; .box-$align{ display: inline-block; } '''), '.box-left{display:inline-block;}')
[docs] def test_variable_usedonly_in_property(self): self.assertEqual(self.process(''' $edge = left; .box{ margin-$edge: 20px; } '''), '.box{margin-left:20px;}')
[docs] def test_variable_property(self): self.assertEqual(self.process(''' $align = left; .box{ float: $align; margin-${align}: 10px; $align: 20px; border-color-$align: 1px solid red; } '''), '.box{float:left;margin-left:10px;left:20px;border-color-left:1px solid red;}')
[docs] def test_variable_selector(self): self.assertEqual(self.process(''' $align = left; .text-${align}{ text-align: ${align}; } .box-$align{ float: $align; display: inline-block; } '''), '.text-left{text-align:left;}.box-left{float:left;display:inline-block;}')
[docs] def test_variable_selector_complex(self): self.assertEqual(self.process(''' $cell = 4; .box:nth-child(${cell}n){ color: red; } '''), '.box:nth-child(4n){color:red;}')
[docs] def test_complex_font_setting(self): self.assertEqual(self.process(''' html { font: 300 1.125em/1.5 sans-serif; } '''), 'html{font:300 1.125em / 1.5 sans-serif;}')
if __name__ == '__main__': logging.getLogger().setLevel(logging.ERROR) suite = unittest.TestLoader().loadTestsFromTestCase(Tests) unittest.TextTestRunner(verbosity=2).run(suite)