BAEL-3859 - Add implementation for AtomicMarkableReference article.
This commit is contained in:
		
							parent
							
								
									b61b190f7c
								
							
						
					
					
						commit
						ae6aaf40f0
					
				| @ -0,0 +1,193 @@ | |||||||
|  | package com.baeldung.concurrent.atomic; | ||||||
|  | 
 | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.concurrent.atomic.AtomicMarkableReference; | ||||||
|  | import org.junit.jupiter.api.Assertions; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | public class AtomicMarkableReferenceUnitTest { | ||||||
|  | 
 | ||||||
|  |     private AtomicMarkableReference<Employee> employeeNode; | ||||||
|  | 
 | ||||||
|  |     class Employee { | ||||||
|  |         private int id; | ||||||
|  |         private String name; | ||||||
|  | 
 | ||||||
|  |         Employee(int id, String name) { | ||||||
|  |             this.id = id; | ||||||
|  |             this.name = name; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public boolean equals(Object obj) { | ||||||
|  |             if (this == obj) { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |             if (obj == null) { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |             if (!(obj instanceof Employee)) | ||||||
|  |                 return false; | ||||||
|  |             Employee employee = (Employee) obj; | ||||||
|  |             return id == employee.id && name.equals(employee.name); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public int hashCode() { | ||||||
|  |             return Objects.hash(id, name); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenMarkValueAsTrue_whenUsingIsMarkedMethod_thenMarkValueShouldBeTrue() { | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(new Employee(123, "Mike"), true); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenMarkValueAsFalse_whenUsingIsMarkedMethod_thenMarkValueShouldBeFalse() { | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(new Employee(123, "Mike"), false); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenUsingGetReferenceMethod_thenCurrentReferenceShouldBeReturned() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, false); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), employee); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenUsingGetMethod_thenCurrentReferenceAndMarkShouldBeReturned() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  | 
 | ||||||
|  |         boolean[] markHolder = new boolean[1]; | ||||||
|  |         Employee currentEmployee = employeeNode.get(markHolder); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertEquals(currentEmployee, employee); | ||||||
|  |         Assertions.assertTrue(markHolder[0]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenNewReferenceAndMark_whenUsingSetMethod_thenCurrentReferenceAndMarkShouldBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  | 
 | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  |         employeeNode.set(newEmployee, false); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), newEmployee); | ||||||
|  |         Assertions.assertFalse(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTheSameObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertTrue(employeeNode.attemptMark(employee, false)); | ||||||
|  |         Assertions.assertFalse(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenDifferentObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldNotBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         Employee expectedEmployee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.attemptMark(expectedEmployee, false)); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenCurrentReferenceAndCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertTrue(employeeNode.compareAndSet(employee, newEmployee, true, false)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), newEmployee); | ||||||
|  |         Assertions.assertFalse(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenNotCurrentReferenceAndCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.compareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), employee); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenCurrentReferenceAndNotCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.compareAndSet(employee, newEmployee, false, true)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), employee); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenNotCurrentReferenceAndNotCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.compareAndSet(new Employee(1234, "Steve"), newEmployee, false, true)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), employee); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertTrue(employeeNode.weakCompareAndSet(employee, newEmployee, true, false)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), newEmployee); | ||||||
|  |         Assertions.assertFalse(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenNotCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { | ||||||
|  |         Employee expectedEmployee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(expectedEmployee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), expectedEmployee); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { | ||||||
|  |         Employee expectedEmployee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(expectedEmployee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.weakCompareAndSet(expectedEmployee, newEmployee, false, true)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), expectedEmployee); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenNotCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { | ||||||
|  |         Employee employee = new Employee(123, "Mike"); | ||||||
|  |         employeeNode = new AtomicMarkableReference<Employee>(employee, true); | ||||||
|  |         Employee newEmployee = new Employee(124, "John"); | ||||||
|  | 
 | ||||||
|  |         Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, false, true)); | ||||||
|  |         Assertions.assertEquals(employeeNode.getReference(), employee); | ||||||
|  |         Assertions.assertTrue(employeeNode.isMarked()); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user