aboutsummaryrefslogtreecommitdiffstats
path: root/eval/src/tests/eval/int8float/int8float_test.cpp
blob: bcc50402686e64eebda00895d48336bfcaac6d3f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include <vespa/eval/eval/int8float.h>
#include <vespa/vespalib/objects/nbostream.h>
#include <vespa/vespalib/gtest/gtest.h>
#include <cmath>

using namespace vespalib;
using namespace vespalib::eval;

static std::vector<float> simple_values = {
    0.0, 1.0, -1.0, -17.0, 42.0, 127.0, -128.0
};

TEST(Int8FloatTest, normal_usage) {
    EXPECT_EQ(sizeof(float), 4);
    EXPECT_EQ(sizeof(Int8Float), 1);
    Int8Float answer = 42;
    double fortytwo = answer;
    EXPECT_EQ(fortytwo, 42);
    for (float value : simple_values) {
        Int8Float b = value;
        float recover = b;
        EXPECT_EQ(value, recover);
    }
    // undefined behavior here:
    Int8Float b1 = 128.0;
    EXPECT_NE(float(b1), 128.0);
    Int8Float b2 = -129.0;
    EXPECT_NE(float(b2), -129.0);
}

TEST(Int8FloatTest, with_nbostream) {
    nbostream buf;
    for (Int8Float value : simple_values) {
        buf << value;
    }
    for (float value : simple_values) {
        Int8Float stored;
        buf >> stored;
        EXPECT_EQ(float(stored), value);
    }
}

TEST(Int8FloatTest, traits_check) {
        EXPECT_TRUE(std::is_trivially_constructible<Int8Float>::value);
        EXPECT_TRUE(std::is_trivially_move_constructible<Int8Float>::value);
        EXPECT_TRUE(std::is_trivially_default_constructible<Int8Float>::value);
        EXPECT_TRUE((std::is_trivially_assignable<Int8Float,Int8Float>::value));
        EXPECT_TRUE(std::is_trivially_move_assignable<Int8Float>::value);
        EXPECT_TRUE(std::is_trivially_copy_assignable<Int8Float>::value);
        EXPECT_TRUE(std::is_trivially_copyable<Int8Float>::value);
        EXPECT_TRUE(std::is_trivially_destructible<Int8Float>::value);
        EXPECT_TRUE(std::is_trivial<Int8Float>::value);
        EXPECT_TRUE(std::is_swappable<Int8Float>::value);
        EXPECT_TRUE(std::has_unique_object_representations<Int8Float>::value);
}

GTEST_MAIN_RUN_ALL_TESTS()