Add AtomicReference to gwt/emul.
Change-Id: Ib3677b5e223a0a128b6f88ef2b436e138b8dcb8b
diff --git a/user/super/com/google/gwt/emul/java/util/concurrent/atomic/AtomicReference.java b/user/super/com/google/gwt/emul/java/util/concurrent/atomic/AtomicReference.java
new file mode 100644
index 0000000..2b494ed
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/util/concurrent/atomic/AtomicReference.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package java.util.concurrent.atomic;
+
+/**
+ * GWT emulation of AtomicReference.
+ *
+ * @param <V> The type of object referred to by this reference
+ */
+public class AtomicReference<V> {
+
+ private V value;
+
+ public AtomicReference() {
+ }
+
+ public AtomicReference(V initialValue) {
+ value = initialValue;
+ }
+
+ public final boolean compareAndSet(V expect, V update) {
+ if (value == expect) {
+ value = update;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public final V get() {
+ return value;
+ }
+
+ public final V getAndSet(V newValue) {
+ V oldValue = value;
+ value = newValue;
+ return oldValue;
+ }
+
+ public final void lazySet(V newValue) {
+ set(newValue);
+ }
+
+ public final void set(V newValue) {
+ value = newValue;
+ }
+
+ public final boolean weakCompareAndSet(V expect, V update) {
+ return compareAndSet(expect, update);
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
diff --git a/user/test/com/google/gwt/emultest/java/util/concurrent/atomic/AtomicReferenceTest.java b/user/test/com/google/gwt/emultest/java/util/concurrent/atomic/AtomicReferenceTest.java
new file mode 100644
index 0000000..6d7e1ca
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/util/concurrent/atomic/AtomicReferenceTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.emultest.java.util.concurrent.atomic;
+
+import com.google.gwt.emultest.java.util.EmulTestBase;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Tests for {@link java.util.concurrent.atomic.AtomicReference} that runs in plain junit and GWT
+ * modes.
+ */
+public class AtomicReferenceTest extends EmulTestBase {
+
+ public void testNoArgConstructor() {
+ AtomicReference<Object> ar = new AtomicReference<>();
+ assertNull(ar.get());
+ }
+
+ public void testWithValueConstructor() {
+ Object object = new Object();
+ AtomicReference<Object> ar = new AtomicReference<>(object);
+ assertEquals(object, ar.get());
+ }
+
+ public void testCompareAndSetPositive() {
+ Object expect = new Object();
+ Object update = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(expect);
+ boolean returnValue = ar.compareAndSet(expect, update);
+
+ assertTrue(returnValue);
+ assertEquals(update, ar.get());
+ }
+
+ public void testCompareAndSetNegative() {
+ Object expect = new Object();
+ Object update = new Object();
+ Object notExpect = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(expect);
+ boolean returnValue = ar.compareAndSet(notExpect, update);
+
+ assertFalse(returnValue);
+ assertEquals(expect, ar.get());
+ }
+
+ public void testGetAndSet() {
+ Object old = new Object();
+ Object update = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(old);
+ Object returnValue = ar.getAndSet(update);
+
+ assertEquals(old, returnValue);
+ assertEquals(update, ar.get());
+ }
+
+ public void testLazySet() {
+ Object old = new Object();
+ Object update = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(old);
+ ar.lazySet(update);
+
+ assertEquals(update, ar.get());
+ }
+
+ public void testSet() {
+ Object old = new Object();
+ Object update = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(old);
+ ar.lazySet(update);
+
+ assertEquals(update, ar.get());
+ }
+
+ public void testWeakCompareAndSetPositive() {
+ Object expect = new Object();
+ Object update = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(expect);
+ boolean returnValue = ar.weakCompareAndSet(expect, update);
+
+ assertTrue(returnValue);
+ assertEquals(update, ar.get());
+ }
+
+ public void testWeakCompareAndSetNegative() {
+ Object expect = new Object();
+ Object update = new Object();
+ Object notExpect = new Object();
+
+ AtomicReference<Object> ar = new AtomicReference<>(expect);
+ boolean returnValue = ar.weakCompareAndSet(notExpect, update);
+
+ assertFalse(returnValue);
+ assertEquals(expect, ar.get());
+ }
+}