summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/tests/test_pfunction.cpp
blob: c82617659ecda433f01a481cfc329454833623c5 (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
// license:GPL-2.0+
// copyright-holders:Couriersud

///
/// \file pfunction_test.cpp
///
/// tests for pfunction
///

#include "plib/ptests.h"

#include "plib/pfunction.h"

#define PFUNCEXPECT(formula, val) \
	EXPECT_EQ(val, plib::pfunction<double>(formula)())

TEST(pfunction, operators)
{
	PFUNCEXPECT("1==1", 1.0);
	PFUNCEXPECT("1 *0 == 2-1-1", 1.0);
	PFUNCEXPECT("0!=1", 1.0);
	PFUNCEXPECT("0<1",  1.0);
	PFUNCEXPECT("1>0",  1.0);
	PFUNCEXPECT("0<=1", 1.0);
	PFUNCEXPECT("1>=0", 1.0);
	PFUNCEXPECT("1<=1", 1.0);
	PFUNCEXPECT("1>=1", 1.0);
	EXPECT_EQ(1.0, plib::pfunction<double>("0!=a", {"a"})({1.0}));
}

TEST(pfunction, func_if)
{
	PFUNCEXPECT("if(1>0, 2, 0)", 2.0);
	PFUNCEXPECT("if(0>1, 2, 3)", 3.0);
	PFUNCEXPECT("if(sin(1)>0, 2, 3)", 3.0); // fail
	EXPECT_EQ( 1.0,   plib::pfunction<double>("if(A2>2.5, 0-A1, (0.07-(0.005*A1))*if(A0>2.5,1,0-1))", {"A0","A1","A2"})({1.0,-1.0,3.0}));
	EXPECT_EQ(-0.065, plib::pfunction<double>("if(A2>2.5, 0-A1, (0.07-(0.005*A1))*if(A0>2.5,1,0-1))", {"A0","A1","A2"})({1.0,1.0,1.0}));
	EXPECT_EQ( 0.065, plib::pfunction<double>("if(A2>2.5, 0-A1, (0.07-(0.005*A1))*if(A0>2.5,1,0-1))", {"A0","A1","A2"})({3.0,1.0,1.0}));
	//EXPECT(plib::pfunction<double>("if(A2>2.5, A1, if(A0>2.5,1,(0-1)))", {"A0","A1","A2"})({1.0,1.0,1.0}), -1.0)
	//PFUNCEXPECT("-1>-2", 1.0)
	EXPECT_TRUE(1.0 == plib::pfunction<double>("0!=a", {"a"})({1.0}));
}

TEST(pfunction, unary_minus)
{
	PFUNCEXPECT("-1>-2", 1.0);
	PFUNCEXPECT("(-3)*(-4)", 12.0);
	PFUNCEXPECT("(-3)*-4", 12.0);
	PFUNCEXPECT("-3*-4", 12.0);
	EXPECT_EQ( -3.0, plib::pfunction<double>("-A0", {"A0"})({3.0}));
	PFUNCEXPECT("3*-trunc(3.2)", -9.0);
	PFUNCEXPECT("3*-(3*2)", -18.0);
	PFUNCEXPECT("3*-(2*1)^2", -12.0);
}