blob: 5653226c46422fa3551b45ed8c9675a400e803ea [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import sys
sys.path += [os.path.dirname(os.path.dirname(__file__))]
from style_variable_generator.base_generator import BaseGenerator, VariableType, Modes
import unittest
class BaseGeneratorTest(unittest.TestCase):
def setUp(self):
self.generator = BaseGenerator()
def ResolveOpacity(self, name, mode=Modes.LIGHT):
opacity_model = self.generator.model[VariableType.OPACITY]
opacity = opacity_model.Resolve(name, mode)
return opacity_model.ResolveOpacity(opacity, mode).a
def ResolveRGBA(self, name, mode=Modes.LIGHT):
return repr(
self.generator.model[VariableType.COLOR].ResolveToRGBA(name, mode))
def testMissingColor(self):
# google_grey_900 is missing.
self.generator.AddJSONToModel('''
{
colors: {
cros_default_text_color: {
light: "$google_grey_900",
dark: "rgb(255, 255, 255)",
},
},
}
''')
self.assertRaises(ValueError, self.generator.Validate)
# Add google_grey_900.
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: "rgb(255, 255, 255)",
}
}
''')
self.generator.Validate()
def testMissingDefaultModeColor(self):
# google_grey_900 is missing in the default mode (light).
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: { dark: "rgb(255, 255, 255)", },
}
}
''')
self.assertRaises(ValueError, self.generator.Validate)
def testDuplicateKeys(self):
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: { light: "rgb(255, 255, 255)", },
}
}
''')
self.generator.Validate()
# Add google_grey_900's dark mode as if in a separate file. This counts
# as a redefinition/conflict and causes an error.
self.assertRaises(
ValueError, self.generator.AddJSONToModel, '''
{
colors: {
google_grey_900: { dark: "rgb(255, 255, 255)", }
}
}
''')
def testBadNames(self):
# Add a bad color name.
self.assertRaises(
ValueError, self.generator.AddJSONToModel, '''
{
colors: {
Google+grey: { dark: "rgb(255, 255, 255)", }
}
}
''')
# Add a bad opacity name.
self.assertRaises(
ValueError, self.generator.AddJSONToModel, '''
{
opacities: {
disabled_things: 0.4,
}
}
''')
def testSimpleOpacity(self):
# Reference a missing opacity.
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: "rgba(255, 255, 255, $disabled_opacity)",
},
opacities: {
disabled_opacity: 0.5,
},
}
''')
self.assertEqual(self.ResolveRGBA('google_grey_900'),
'rgba(255, 255, 255, 0.5)')
self.generator.Validate()
def testReferenceOpacity(self):
# Add a reference opacity.
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: "rgba(255, 255, 255, $disabled_opacity)",
},
opacities: {
disabled_opacity: "$second_opacity",
second_opacity: { "light": "$another_opacity", "dark": 1 },
another_opacity: 0.5,
},
}
''')
self.assertEqual(self.ResolveRGBA('google_grey_900'),
'rgba(255, 255, 255, 0.5)')
self.assertEqual(self.ResolveOpacity('disabled_opacity'), 0.5)
self.assertEqual(self.ResolveOpacity('disabled_opacity', Modes.DARK), 1)
def testMissingOpacity(self):
# Reference a missing opacity.
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: "rgba(255, 255, 255, $missing_opacity)",
},
opacities: {
disabled_opacity: 0.5,
},
}
''')
self.assertRaises(ValueError, self.generator.Validate)
self.generator.AddJSONToModel('''
{
opacities: {
missing_opacity: 0.5,
},
}
''')
self.generator.Validate()
def testSelfReferenceColor(self):
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: "$google_grey_900",
}
}
''')
self.assertRaises(ValueError, self.generator.Validate)
def testSelfReferenceOpacity(self):
self.generator.AddJSONToModel('''
{
opacities: {
some_opacity: "$some_opacity",
}
}
''')
self.assertRaises(ValueError, self.generator.Validate)
def testBlend(self):
self.generator.AddJSONToModel('''
{
colors: {
expect_color_white: "blend($white, #202124)",
expect_color_lighter: "blend(rgba($white_rgb, 0.06), rgba(32, 33, 36, 0.6))"
}
}
''')
self.assertEqual(self.ResolveRGBA('expect_color_white'),
'rgba(255, 255, 255, 1)')
self.assertEqual(self.ResolveRGBA('expect_color_lighter'),
'rgba(53, 54, 57, 0.624)')
def testBlendVariableReference(self):
self.generator.AddJSONToModel('''
{
colors: {
google_grey_900: "#202124",
bg_color_elevation_3: "blend(rgba($white_rgb, 0.08), $google_grey_900)",
}
}
''')
self.assertEqual(self.ResolveRGBA('bg_color_elevation_3'),
'rgba(50, 51, 54, 1)')
def testBlendMoreVariableReferences(self):
self.generator.AddJSONToModel('''
{
colors: {
color_a: "blend(rgba($white_rgb, 0.5), $black)",
color_b: "blend(rgba($color_a_rgb, 0.5), rgba($black_rgb, 0.5))",
color_c: "blend($color_a, blend(rgba($color_b_rgb, 0.5), $white))",
}
}
''')
self.assertEqual(self.ResolveRGBA('color_a'), 'rgba(128, 128, 128, 1)')
self.assertEqual(self.ResolveRGBA('color_b'), 'rgba(85, 85, 85, 0.75)')
# Same as color_a because color_a has alpha 1.
self.assertEqual(self.ResolveRGBA('color_c'), 'rgba(128, 128, 128, 1)')
def testBlendVariableReferenceLightDarkModes(self):
self.generator.AddJSONToModel('''
{
colors: {
google_blue_300: "#8ab4f8",
google_blue_600: "#1a73e8",
color_prominent: {
light: "$google_blue_600",
dark: "$google_blue_300",
},
color_prominent_dull: {
light: "blend(rgba($white_rgb, 0.08), $color_prominent)",
dark: "blend(rgba($black_rgb, 0.08), $color_prominent)",
},
}
}
''')
self.assertEqual(self.ResolveRGBA('color_prominent_dull', Modes.LIGHT),
'rgba(44, 126, 234, 1)')
self.assertEqual(self.ResolveRGBA('color_prominent_dull', Modes.DARK),
'rgba(127, 166, 228, 1)')
def testBlendNested(self):
self.generator.AddJSONToModel('''
{
colors: {
expect_color_black: "blend(blend($black, $white), $white)",
}
}
''')
self.assertEqual(self.ResolveRGBA('expect_color_black'),
'rgba(0, 0, 0, 1)')
def testMissingBlendColor(self):
self.generator.AddJSONToModel('''
{
colors: {
bg_color_elevation_10: "blend($white, $google_grey_900)",
}
}
''')
self.assertRaises(ValueError, self.generator.Validate)
def testInvertedColors(self):
# Add an inverted color.
self.generator.AddJSONToModel('''
{
colors: {
alert: { light: "$white", dark: "$black", generate_inverted: true },
},
}
''')
self.assertEqual(self.ResolveRGBA('alert', Modes.LIGHT),
'rgba(255, 255, 255, 1)')
self.assertEqual(self.ResolveRGBA('alert', Modes.DARK),
'rgba(0, 0, 0, 1)')
self.assertEqual(self.ResolveRGBA('alert_inverted', Modes.LIGHT),
'rgba(0, 0, 0, 1)')
self.assertEqual(self.ResolveRGBA('alert_inverted', Modes.DARK),
'rgba(255, 255, 255, 1)')
def testInvertedWithSingleMode(self):
# Add an inverted color without a dark mode.
self.assertRaises(
ValueError, self.generator.AddJSONToModel, '''
{
colors: {
alert: { light: "$white", generate_inverted: true },
},
}
''')
def testIllegalSuffix(self):
self.generator.AddJSONToModel('''
{
colors: {
some_inverted: "$black",
}
}
''')
self.assertRaises(ValueError, self.generator.Validate)
def testPerModeColors(self):
# Add a per-mode color.
self.generator.AddJSONToModel('''
{
colors: {
alert: {
light: "$white",
dark: "$black",
debug: "$black",
generate_per_mode: true
},
},
}
''')
self.assertEqual(self.ResolveRGBA('alert_dark'), 'rgba(0, 0, 0, 1)')
self.assertEqual(self.ResolveRGBA('alert_light'),
'rgba(255, 255, 255, 1)')
self.assertEqual(self.ResolveRGBA('alert_debug'), 'rgba(0, 0, 0, 1)')
self.assertEqual(self.ResolveRGBA('alert'), 'rgba(255, 255, 255, 1)')
if __name__ == '__main__':
unittest.main()