// SPDX-License-Identifier: Apache-2.0
// Copyright (C) 2018 IBM Corp.

#include "config.h"
#include <assert.h>

#include "common.h"
#include "pnor_partition_defs.h"
#include "pnor_partition_table.hpp"

static constexpr auto BLOCK_SIZE = 4 * 1024;
static constexpr auto DATA_MASK = ((1 << 24) - 1);

int main()
{
    namespace vpnor = openpower::virtual_pnor;

    struct pnor_partition part;
    std::string line;

    mbox_vlog = mbox_log_console;
    verbosity = MBOX_LOG_DEBUG;

    line = "partition01=FOO,00001000,00002000,80,ECC";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert((part.data.user.data[0]) == PARTITION_ECC_PROTECTED);
    assert(!(part.data.user.data[1] & DATA_MASK));

    line = "partition01=FOO,00001000,00002000,80,PRESERVED";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_PRESERVED);

    line = "partition01=FOO,00001000,00002000,80,READONLY";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_READONLY);

    /* BACKUP is unimplemented */
    line = "partition01=FOO,00001000,00002000,80,BACKUP";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert(!(part.data.user.data[1] & DATA_MASK));

    line = "partition01=FOO,00001000,00002000,80,REPROVISION";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_REPROVISION);

    line = "partition01=FOO,00001000,00002000,80,VOLATILE";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_VOLATILE);

    line = "partition01=FOO,00001000,00002000,80,CLEARECC";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert((part.data.user.data[1] & DATA_MASK) == PARTITION_CLEARECC);

    line = "partition01=FOO,00001000,00002000,80,READWRITE";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert(((part.data.user.data[1] & DATA_MASK) ^ PARTITION_READONLY) ==
           PARTITION_READONLY);

    line = "partition01=FOO,00001000,00002000,80,";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert(!(part.data.user.data[1] & DATA_MASK));

    line = "partition01=FOO,00001000,00002000,80,junk";
    vpnor::parseTocLine(line, BLOCK_SIZE, part);
    assert(!(part.data.user.data[0]));
    assert(!(part.data.user.data[1] & DATA_MASK));

    return 0;
}
