1*ae60884dSStanislav Gatev //===- unittests/Analysis/FlowSensitive/DataflowAnalysisContextTest.cpp ---===//
2*ae60884dSStanislav Gatev //
3*ae60884dSStanislav Gatev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ae60884dSStanislav Gatev // See https://llvm.org/LICENSE.txt for license information.
5*ae60884dSStanislav Gatev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ae60884dSStanislav Gatev //
7*ae60884dSStanislav Gatev //===----------------------------------------------------------------------===//
8*ae60884dSStanislav Gatev 
9*ae60884dSStanislav Gatev #include "clang/Analysis/FlowSensitive/DataflowAnalysisContext.h"
10*ae60884dSStanislav Gatev #include "clang/Analysis/FlowSensitive/WatchedLiteralsSolver.h"
11*ae60884dSStanislav Gatev #include "gmock/gmock.h"
12*ae60884dSStanislav Gatev #include "gtest/gtest.h"
13*ae60884dSStanislav Gatev #include <memory>
14*ae60884dSStanislav Gatev 
15*ae60884dSStanislav Gatev namespace {
16*ae60884dSStanislav Gatev 
17*ae60884dSStanislav Gatev using namespace clang;
18*ae60884dSStanislav Gatev using namespace dataflow;
19*ae60884dSStanislav Gatev 
20*ae60884dSStanislav Gatev class DataflowAnalysisContextTest : public ::testing::Test {
21*ae60884dSStanislav Gatev protected:
22*ae60884dSStanislav Gatev   DataflowAnalysisContextTest()
23*ae60884dSStanislav Gatev       : Context(std::make_unique<WatchedLiteralsSolver>()) {}
24*ae60884dSStanislav Gatev 
25*ae60884dSStanislav Gatev   DataflowAnalysisContext Context;
26*ae60884dSStanislav Gatev };
27*ae60884dSStanislav Gatev 
28*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest,
29*ae60884dSStanislav Gatev        CreateAtomicBoolValueReturnsDistinctValues) {
30*ae60884dSStanislav Gatev   auto &X = Context.createAtomicBoolValue();
31*ae60884dSStanislav Gatev   auto &Y = Context.createAtomicBoolValue();
32*ae60884dSStanislav Gatev   EXPECT_NE(&X, &Y);
33*ae60884dSStanislav Gatev }
34*ae60884dSStanislav Gatev 
35*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest,
36*ae60884dSStanislav Gatev        GetOrCreateConjunctionValueReturnsSameExprGivenSameArgs) {
37*ae60884dSStanislav Gatev   auto &X = Context.createAtomicBoolValue();
38*ae60884dSStanislav Gatev   auto &XAndX = Context.getOrCreateConjunctionValue(X, X);
39*ae60884dSStanislav Gatev   EXPECT_EQ(&XAndX, &X);
40*ae60884dSStanislav Gatev }
41*ae60884dSStanislav Gatev 
42*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest,
43*ae60884dSStanislav Gatev        GetOrCreateConjunctionValueReturnsSameExprOnSubsequentCalls) {
44*ae60884dSStanislav Gatev   auto &X = Context.createAtomicBoolValue();
45*ae60884dSStanislav Gatev   auto &Y = Context.createAtomicBoolValue();
46*ae60884dSStanislav Gatev   auto &XAndY1 = Context.getOrCreateConjunctionValue(X, Y);
47*ae60884dSStanislav Gatev   auto &XAndY2 = Context.getOrCreateConjunctionValue(X, Y);
48*ae60884dSStanislav Gatev   EXPECT_EQ(&XAndY1, &XAndY2);
49*ae60884dSStanislav Gatev 
50*ae60884dSStanislav Gatev   auto &YAndX = Context.getOrCreateConjunctionValue(Y, X);
51*ae60884dSStanislav Gatev   EXPECT_EQ(&XAndY1, &YAndX);
52*ae60884dSStanislav Gatev 
53*ae60884dSStanislav Gatev   auto &Z = Context.createAtomicBoolValue();
54*ae60884dSStanislav Gatev   auto &XAndZ = Context.getOrCreateConjunctionValue(X, Z);
55*ae60884dSStanislav Gatev   EXPECT_NE(&XAndY1, &XAndZ);
56*ae60884dSStanislav Gatev }
57*ae60884dSStanislav Gatev 
58*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest,
59*ae60884dSStanislav Gatev        GetOrCreateDisjunctionValueReturnsSameExprGivenSameArgs) {
60*ae60884dSStanislav Gatev   auto &X = Context.createAtomicBoolValue();
61*ae60884dSStanislav Gatev   auto &XOrX = Context.getOrCreateDisjunctionValue(X, X);
62*ae60884dSStanislav Gatev   EXPECT_EQ(&XOrX, &X);
63*ae60884dSStanislav Gatev }
64*ae60884dSStanislav Gatev 
65*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest,
66*ae60884dSStanislav Gatev        GetOrCreateDisjunctionValueReturnsSameExprOnSubsequentCalls) {
67*ae60884dSStanislav Gatev   auto &X = Context.createAtomicBoolValue();
68*ae60884dSStanislav Gatev   auto &Y = Context.createAtomicBoolValue();
69*ae60884dSStanislav Gatev   auto &XOrY1 = Context.getOrCreateDisjunctionValue(X, Y);
70*ae60884dSStanislav Gatev   auto &XOrY2 = Context.getOrCreateDisjunctionValue(X, Y);
71*ae60884dSStanislav Gatev   EXPECT_EQ(&XOrY1, &XOrY2);
72*ae60884dSStanislav Gatev 
73*ae60884dSStanislav Gatev   auto &YOrX = Context.getOrCreateDisjunctionValue(Y, X);
74*ae60884dSStanislav Gatev   EXPECT_EQ(&XOrY1, &YOrX);
75*ae60884dSStanislav Gatev 
76*ae60884dSStanislav Gatev   auto &Z = Context.createAtomicBoolValue();
77*ae60884dSStanislav Gatev   auto &XOrZ = Context.getOrCreateDisjunctionValue(X, Z);
78*ae60884dSStanislav Gatev   EXPECT_NE(&XOrY1, &XOrZ);
79*ae60884dSStanislav Gatev }
80*ae60884dSStanislav Gatev 
81*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest,
82*ae60884dSStanislav Gatev        GetOrCreateNegationValueReturnsSameExprOnSubsequentCalls) {
83*ae60884dSStanislav Gatev   auto &X = Context.createAtomicBoolValue();
84*ae60884dSStanislav Gatev   auto &NotX1 = Context.getOrCreateNegationValue(X);
85*ae60884dSStanislav Gatev   auto &NotX2 = Context.getOrCreateNegationValue(X);
86*ae60884dSStanislav Gatev   EXPECT_EQ(&NotX1, &NotX2);
87*ae60884dSStanislav Gatev 
88*ae60884dSStanislav Gatev   auto &Y = Context.createAtomicBoolValue();
89*ae60884dSStanislav Gatev   auto &NotY = Context.getOrCreateNegationValue(Y);
90*ae60884dSStanislav Gatev   EXPECT_NE(&NotX1, &NotY);
91*ae60884dSStanislav Gatev }
92*ae60884dSStanislav Gatev 
93*ae60884dSStanislav Gatev } // namespace
94