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