insulate("Log buffer", function()
    -- auto-insulate every test
    local realIt = it
    it = function(name, func)
        insulate(function()
            realIt(name, func)
        end)
    end

    it("should buffer logs", function()
        local buffer = require "src.my-log-buffer"

        assert.is_false(buffer:hasLog())
        assert.is_nil(buffer:getLog())

        buffer:addLog(buffer.ERROR, "just a test")

        assert.is_true(buffer:hasLog())

        local severity, msg = buffer:getLog()
        assert.is_same(buffer.ERROR, severity)
        assert.is_same("just a test", msg)
        assert.is_false(buffer:hasLog())
        assert.is_nil(buffer:getLog())
    end)
    it("should maintain the order of logs", function()
        local buffer = require "src.my-log-buffer"

        buffer:addLog(buffer.INFO, "one")
        buffer:addLog(buffer.INFO, "two")
        buffer:addLog(buffer.INFO, "three")
        buffer:addLog(buffer.INFO, "four")

        local _, msg = buffer:getLog()
        assert.is_same("one", msg)
        local _, msg = buffer:getLog()
        assert.is_same("two", msg)
        local _, msg = buffer:getLog()
        assert.is_same("three", msg)
        local _, msg = buffer:getLog()
        assert.is_same("four", msg)
    end)
    it("should limit the number of logs and keep the newest", function()
        local buffer = require "src.my-log-buffer"

        for i=1, 20 do
            buffer:addLog(buffer.INFO, string.format("%d", i))
        end

        local _, msg = buffer:getLog()
        assert.is_same("11", msg)
    end)
    it("should discard info, then warning, then errors", function()
        local buffer = require "src.my-log-buffer"

        for i=1, 14 do
            local severity
            if i % 3 == 1 then
                severity = buffer.INFO
            elseif i % 3 == 2 then
                severity = buffer.WARN
            else
                severity = buffer.ERROR
            end

            buffer:addLog(severity, string.format("%d", i))
        end

        local logs = {}

        while buffer:hasLog() do
            local _, msg = buffer:getLog()
            table.insert(logs, msg)
        end

        assert.is_same({"2", "3", "5", "6", "8", "9", "11", "12", "13", "14"}, logs)
    end)
    it("should limit the message length to avoid blocked memory", function()
        local buffer = require "src.my-log-buffer"

        local input = ""
        for _=1,10 do
            input = input .. "1234567890"
        end

        buffer:addLog(buffer.INFO, input)

        local _, msg = buffer:getLog()
        assert.is_same(80, msg:len())
    end)
end)