howl.ui.theme
assigning directly to .current raises an error
File.with_tmpfile (file) ->
file.contents = serpent.dump spec_theme
theme.register 'foo', file
assert.has_errors -> config.current = 'foo'
register(name, file)
adds name to .all
file = File 'test'
theme.register 'test', file
assert.equal theme.all.test, file
raises an error if name is omitted
status, msg = pcall theme.register, nil, File 'foo'
assert.is_false(status)
assert.match msg, 'name'
raises an error if file is omitted
status, msg = pcall theme.register, 'test'
assert.is_false(status)
assert.match msg, 'file'
unregister(name)
removes the theme from all
file = File 'tmp'
theme.register 'tmp', file
theme.unregister 'tmp'
assert.is_nil theme.all.tmp
assigning a new theme to config.theme
logs an error if there's an error loading the theme
File.with_tmpfile (file) ->
file.contents = "error('cantload')"
theme.register 'error', file
config.theme = 'error'
assert.match log.last_error.message, 'cantload'
assigns the loaded theme to .current and sets .name
File.with_tmpfile (file) ->
file.contents = serpent.dump spec_theme
theme.register 'foo', file
config.theme = 'foo'
expected = theme_copy!
expected.name = 'foo'
assert.same theme.current, expected
emits a theme-changed event with the newly set theme
File.with_tmpfile (file) ->
file.contents = serpent.dump spec_theme
theme.register 'alert', file
handler = spy.new -> true
signal.connect 'theme-changed', handler
config.theme = 'alert'
signal.disconnect 'theme-changed', handler
expected = theme_copy!
expected.name = 'alert'
assert.spy(handler).was_called_with theme: expected
does not propagate global assignments to the global environment
File.with_tmpfile (file) ->
file.contents = 'spec_global = "noo!"\n' .. serpent.dump spec_theme
theme.register 'foo', file
config.theme = 'foo'
assert.is_nil _G.spec_global
allows the use of named colors
File.with_tmpfile (file) ->
theme_string = serpent.dump spec_theme
theme_string = theme_string\gsub '"#777777"', 'violet' -- footer.color
file.contents = theme_string
theme.register 'colors', file
config.theme = 'colors'
assert.equal theme.current.editor.footer.color, '#ee82ee'
life cycle management
automatically applies a theme upon registration if that theme is already set as current
File.with_tmpfile (file) ->
the_theme = theme_copy!
file.contents = serpent.dump the_theme
theme.register 'reloadme', file
config.theme = 'reloadme'
theme.unregister 'reloadme'
the_theme.window.background = '#112233'
file.contents = serpent.dump the_theme
theme.register 'reloadme', file
assert.equal '#112233', theme.current.window.background
keeps the loaded in-memory theme when the current is unregistered
File.with_tmpfile (file) ->
file.contents = serpent.dump spec_theme
theme.register 'keepme', file
config.theme = 'keepme'
theme.unregister 'keepme'
assert.equal 'keepme', theme.current.name