-- Test set_{,new}index_miss_handler

local mouse = mouse
local class = tag
local obj = class({})
local handler = require("gears.object.properties")
local abutton = require("awful.button")
local gtable = require("gears.table")
local wibox = require("wibox")
local runner = require("_runner")

awesome.connect_signal("debug::index::miss", error)
awesome.connect_signal("debug::newindex::miss", error)

class.set_index_miss_handler(function(o, k)
    assert(o == obj)
    assert(k == "key")
    return 42
end)
assert(obj.key == 42)

local called = false
class.set_newindex_miss_handler(function(o, k, v)
    assert(o == obj)
    assert(k == "key")
    assert(v == 42)
    called = true
end)
obj.key = 42
assert(called)

handler(class, {auto_emit=true})

assert(not obj.key)
obj.key = 1337
assert(obj.key == 1337)

-- The the custom mouse handler
mouse.foo = "bar"
assert(mouse.foo == "bar")

local w = wibox()
w.foo = "bar"
assert(w.foo == "bar")

-- Test if read-only properties really are read-only
screen[1].clients = 42
assert(screen[1].clients ~= 42)

-- Test the wibox declarative widget system (drawin proxy)

local w2 = wibox {
    visible = true,
    wisth = 100,
    height = 100
}

w2:setup{
    {
        text   = "Awesomeness!",
        id     = "main_textbox",
        widget = wibox.widget.textbox,
    },
    id     = "main_background",
    widget = wibox.container.background
}

assert(w2.main_background)
assert(w2:get_children_by_id("main_background")[1])
assert(w2:get_children_by_id("main_textbox")[1])
assert(w2.main_background.main_textbox)
assert(w2.main_background == w2:get_children_by_id("main_background")[1])

-- You can't retry this, so if the assert above were false, assume it never
-- reaches this.

local steps = { function() return true end }

-- Try each combinations of current and legacy style accessors.
table.insert(steps, function()local b1, b2 = button({}, 1, function() end), button({}, 2, function() end)
    root.buttons = {b1}

    assert(#root.buttons   == 1 )
    assert(#root.buttons() == 1 )
    assert(root.buttons[1] == b1)

    root.buttons{b2}

    assert(#root.buttons     == 1 )
    assert(#root.buttons()   == 1 )
    assert(root.buttons()[1] == b2)

    local ab1, ab2 = abutton({}, 1, function() end), abutton({}, 2, function() end)

    root.buttons = {ab1}
    assert(#root.buttons == 1)
    assert(#root.buttons() == 4)
    for i=1, 4 do
        assert(root.buttons()[i] == ab1[i])
    end

    root.buttons(gtable.join(ab2))
    assert(#root.buttons == 1)
    assert(#root.buttons() == 4)
    for i=1, 4 do
        assert(root.buttons()[i] == ab2[i])
    end

    root.buttons{ab1}
    assert(#root.buttons == 1)
    assert(#root.buttons() == 4)
    for i=1, 4 do
        assert(root.buttons()[i] == ab1[i])
    end

    return true
end)

runner.run_steps(steps)

-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80