#include <riscv_vector.h>
#include <springbok.h>
#include <stdio.h>
#include <stdlib.h>

#include "pw_unit_test/framework.h"
#include "softrvv.h"

namespace softrvv_vor_test {
namespace {

uint32_t src1[] = {0xAA, 0xA5, 0x5A, 0x55, 0xFF};  // 0x55 = 0b0101

// vector test
uint32_t src2[] = {0xAA, 0xAA, 0x00, 0xAA, 0xAA};  // 0xAA = 0b1010

// register tests
uint32_t rs1[] = {0xAA, 0x0A, 0xA0};

// imm tests
// Note: simm5 is sign extended before op
uint32_t imm[] = {
    0xF0,
    0x05,
    0x0E,
};  // simm5 ∈ [-16, 15]; 0xF0 = -16; 0x0E = 15

const uint32_t kAVL = sizeof(src1) / sizeof(src1[0]);
uint32_t dest[kAVL];

uint32_t ref_vv[] = {0xAA, 0xAF, 0x5A, 0xFF, 0xFF};

uint32_t ref_vx[3][kAVL] = {{0xAA, 0xAF, 0xFA, 0xFF, 0xFF},
                            {0xAA, 0xAF, 0x5A, 0x5F, 0xFF},
                            {0xAA, 0xA5, 0xFA, 0xF5, 0xFF}};

uint32_t ref_vi[3][kAVL] = {{0xFA, 0xF5, 0xFA, 0xF5, 0xFF},
                            {0xAF, 0xA5, 0x5F, 0x55, 0xFF},
                            {0xAE, 0xAF, 0x5E, 0x5F, 0xFF}};

class SoftRvvVorTest : public ::testing::Test {
 protected:
  void SetUp() override { memset(dest, 0, sizeof(dest)); }
};

TEST_F(SoftRvvVorTest, VV) {
  softrvv::vor_vv<uint32_t>(dest, src1, src2, kAVL);
  ASSERT_EQ(memcmp(dest, ref_vv, sizeof(dest)), 0);
}

TEST_F(SoftRvvVorTest, VX) {
  const int32_t num_vx_tests = sizeof(rs1) / sizeof(rs1[0]);
  for (int32_t i = 0; i < num_vx_tests; i++) {
    softrvv::vor_vx<uint32_t>(dest, src1, &rs1[i], kAVL);
    ASSERT_EQ(memcmp(dest, &ref_vx[i], sizeof(dest)), 0);
  }
}

TEST_F(SoftRvvVorTest, VI) {
  const int32_t num_vi_tests = sizeof(imm) / sizeof(imm[0]);
  for (int32_t i = 0; i < num_vi_tests; i++) {
    softrvv::vor_vx<uint32_t>(dest, src1, &imm[i], kAVL);
    ASSERT_EQ(memcmp(dest, &ref_vi[i], sizeof(dest)), 0);
  }
}

}  // namespace
}  // namespace softrvv_vor_test
