xref: /aosp_15_r20/external/nullaway/nullaway/src/test/java/com/uber/nullaway/NullAwayKeySetIteratorTests.java (revision f50c306653bc89b8210ce6c9e0b0b44fc134bc03)
1 package com.uber.nullaway;
2 
3 import org.junit.Test;
4 
5 public class NullAwayKeySetIteratorTests extends NullAwayTestsBase {
6 
7   @Test
mapKeySetIteratorBasic()8   public void mapKeySetIteratorBasic() {
9     defaultCompilationHelper
10         .addSourceLines(
11             "Test.java",
12             "package com.uber;",
13             "import java.util.Map;",
14             "public class Test {",
15             "  public void keySetStuff(Map<Object, Object> m) {",
16             "    for (Object k: m.keySet()) {",
17             "      m.get(k).toString();",
18             "    }",
19             "  }",
20             "}")
21         .doTest();
22   }
23 
24   @Test
mapKeySetIteratorShadowing()25   public void mapKeySetIteratorShadowing() {
26     defaultCompilationHelper
27         .addSourceLines(
28             "Test.java",
29             "package com.uber;",
30             "import java.util.Map;",
31             "public class Test {",
32             "  private final Object k = new Object();",
33             "  public void keySetStuff(Map<Object, Object> m) {",
34             "    for (Object k: m.keySet()) {",
35             "      m.get(k).toString();",
36             "    }",
37             "    // BUG: Diagnostic contains: dereferenced expression m.get(k) is @Nullable",
38             "    m.get(k).toString();",
39             "  }",
40             "}")
41         .doTest();
42   }
43 
44   @Test
mapKeySetIteratorDeeperAccessPath()45   public void mapKeySetIteratorDeeperAccessPath() {
46     defaultCompilationHelper
47         .addSourceLines(
48             "Test.java",
49             "package com.uber;",
50             "import java.util.Map;",
51             "import java.util.HashMap;",
52             "public class Test {",
53             "  static class MapWrapper {",
54             "    Map<Object,Object> mf = new HashMap<>();",
55             "    public Map<Object,Object> getMF() { return mf; }",
56             "    public Map<Object,Object> getMF2(int i) { return mf; }",
57             "  }",
58             "  public void keySetStuff(MapWrapper mw, int j) {",
59             "    for (Object k: mw.mf.keySet()) {",
60             "      mw.mf.get(k).toString();",
61             "    }",
62             "    for (Object k: mw.getMF().keySet()) {",
63             "      mw.getMF().get(k).toString();",
64             "    }",
65             "    for (Object k: mw.getMF2(10).keySet()) {",
66             "      mw.getMF2(10).get(k).toString();",
67             "    }",
68             "    for (Object k: mw.getMF2(j).keySet()) {",
69             "      // Report error since we cannot represent mw.getMF2(j).get(k) with an access path",
70             "      // BUG: Diagnostic contains: dereferenced expression mw.getMF2(j).get(k) is @Nullable",
71             "      mw.getMF2(j).get(k).toString();",
72             "    }",
73             "  }",
74             "}")
75         .doTest();
76   }
77 
78   @Test
unhandledCases()79   public void unhandledCases() {
80     defaultCompilationHelper
81         .addSourceLines(
82             "Test.java",
83             "package com.uber;",
84             "import java.util.Iterator;",
85             "import java.util.Map;",
86             "public class Test {",
87             "  public void keySetStuff(Map<Object, Object> m) {",
88             "    // BUG: Diagnostic contains: dereferenced expression",
89             "    m.get(m.keySet().iterator().next()).toString();",
90             "    Iterator<Object> iter = m.keySet().iterator();",
91             "    while (iter.hasNext()) {",
92             "      // BUG: Diagnostic contains: dereferenced expression",
93             "      m.get(iter.next()).toString();",
94             "    }",
95             "  }",
96             "}")
97         .doTest();
98   }
99 
100   @Test
nestedLoops()101   public void nestedLoops() {
102     defaultCompilationHelper
103         .addSourceLines(
104             "Test.java",
105             "package com.uber;",
106             "import java.util.Map;",
107             "public class Test {",
108             "  public void keySetStuff(Map<Object, Object> m, Map<Object, Object> m2) {",
109             "    for (Object k: m.keySet()) {",
110             "      for (Object k2: m2.keySet()) {",
111             "        m.get(k).toString();",
112             "        // BUG: Diagnostic contains: dereferenced expression",
113             "        m.get(k2).toString();",
114             "        // BUG: Diagnostic contains: dereferenced expression",
115             "        m2.get(k).toString();",
116             "        m2.get(k2).toString();",
117             "      }",
118             "    }",
119             "    // nested loop over the same map",
120             "    for (Object k: m.keySet()) {",
121             "      for (Object k2: m.keySet()) {",
122             "        m.get(k).toString();",
123             "        m.get(k2).toString();",
124             "        // BUG: Diagnostic contains: dereferenced expression",
125             "        m2.get(k).toString();",
126             "        // BUG: Diagnostic contains: dereferenced expression",
127             "        m2.get(k2).toString();",
128             "      }",
129             "    }",
130             "  }",
131             "}")
132         .doTest();
133   }
134 
135   @Test
declaredTypeSubtypeOfMap()136   public void declaredTypeSubtypeOfMap() {
137     defaultCompilationHelper
138         .addSourceLines(
139             "Test.java",
140             "package com.uber;",
141             "import com.google.common.collect.ImmutableMap;",
142             "import java.util.TreeMap;",
143             "import java.util.LinkedHashMap;",
144             "public class Test {",
145             "  public void keySetStuff1(ImmutableMap<Object, Object> m) {",
146             "    for (Object k: m.keySet()) {",
147             "      m.get(k).toString();",
148             "    }",
149             "  }",
150             "  public void keySetStuff2(TreeMap<Object, Object> m) {",
151             "    for (Object k: m.keySet()) {",
152             "      m.get(k).toString();",
153             "    }",
154             "  }",
155             "  public void keySetStuff3(LinkedHashMap<Object, Object> m) {",
156             "    for (Object k: m.keySet()) {",
157             "      m.get(k).toString();",
158             "    }",
159             "  }",
160             "}")
161         .doTest();
162   }
163 }
164