local tests = {
    from_only_url = function()
        local img = c2.Image.from_url("https://chatterino.com/foo/1x")
        assert(img.url == "https://chatterino.com/foo/1x")
        assert(not img.animated)
        assert(not img.is_loaded)
        assert(not img.is_empty)
        assert(img.width == 16) -- default width
        assert(img.height == 16) -- default height
        assert(img.scale == 1) -- default scale
        assert(img.size[1] == img.width)
        assert(img.size[2] == img.height)
    end,
    from_url_and_scale = function()
        local img = c2.Image.from_url("https://chatterino.com/foo/2x", 0.5)
        assert(img.url == "https://chatterino.com/foo/2x")
        assert(not img.animated)
        assert(not img.is_loaded)
        assert(not img.is_empty)
        assert(img.width == 4) -- default width * scale * scale (once in the constructor and once in the width accessor)
        assert(img.height == 4) -- default height * scale * scale
        assert(img.scale == 0.5)
        assert(img.size[1] == img.width)
        assert(img.size[2] == img.height)
    end,
    from_url_scale_exp_size = function()
        local img = c2.Image.from_url("https://chatterino.com/bar/2x", 0.5, { 64, 32 })
        assert(img.url == "https://chatterino.com/bar/2x")
        assert(not img.animated)
        assert(not img.is_loaded)
        assert(not img.is_empty)
        assert(img.width == 32) -- width * scale
        assert(img.height == 16) -- height * scale
        assert(img.scale == 0.5)
        assert(img.size[1] == img.width)
        assert(img.size[2] == img.height)
    end,
    from_invalid_url = function()
        local ok, res = pcall(c2.Image.from_url, "ws://foo")
        assert(not ok and res == "Invalid URL")
    end,
    empty = function()
        local img = c2.Image.empty()
        assert(img.url == "")
        assert(not img.animated)
        assert(not img.is_loaded)
        assert(img.is_empty)
        assert(img.width == 0)
        assert(img.height == 0)
        assert(img.scale == 1)
        assert(img.size[1] == img.width)
        assert(img.size[2] == img.height)
    end,
    equality = function()
        local imageA = c2.Image.from_url("https://chatterino.com/image-equality/A")
        local imageB = c2.Image.from_url("https://chatterino.com/image-equality/B")
        local imageC = c2.Image.from_url("https://chatterino.com/image-equality/C")
        local imageC2 = c2.Image.from_url("https://chatterino.com/image-equality/C") -- should be the same as C
        local imageA2 = c2.Image.from_url("https://chatterino.com/image-equality/A", 0.5) -- should be the same as A

        assert(imageA == imageA)
        assert(imageA ~= imageB)
        assert(imageA ~= imageC)
        assert(imageA ~= imageC2)
        assert(imageA == imageA2)

        assert(imageB ~= imageA)
        assert(imageB == imageB)
        assert(imageB ~= imageC)
        assert(imageB ~= imageC2)
        assert(imageB ~= imageA2)

        assert(imageC ~= imageA)
        assert(imageC ~= imageB)
        assert(imageC == imageC)
        assert(imageC == imageC2)
        assert(imageC ~= imageA2)
    end,
}

for name, fn in pairs(tests) do
    local ok, res = pcall(fn)
    if not ok then
        error(name .. " failed: " .. res)
    end
end
