// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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

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

namespace softrvv_vzext_test {
namespace {

uint16_t src1[] = {1, 2, 3, 4, 5};
const uint32_t AVL_CONST = sizeof(src1) / sizeof(src1[0]);
uint32_t dest[AVL_CONST];
uint32_t ref_dest[] = {1, 2, 3, 4, 5};

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

TEST_F(SoftRvvVzextTest, VF2) {
  softrvv::vzext_v<uint32_t, uint16_t>(dest, src1, AVL_CONST);
  ASSERT_EQ(memcmp(dest, ref_dest, sizeof(dest)), 0);
}

}  // namespace
}  // namespace softrvv_vzext_test
