1   package net.sf.fleet.test;
2   
3   import static org.testng.Assert.*;
4   
5   import java.util.HashSet;
6   import java.util.Set;
7   
8   import net.sf.fleet.Context;
9   import net.sf.fleet.annotations.Configuration;
10  import net.sf.fleet.annotations.Contribution;
11  import net.sf.fleet.annotations.Module;
12  import net.sf.fleet.annotations.NotCachable;
13  import net.sf.fleet.exceptions.FleetConfigurationException;
14  import net.sf.fleet.impl.ContextImpl;
15  
16  import org.testng.annotations.Test;
17  
18  public class ContributionsIntegrationTest {
19  	@Module
20  	public interface ModuleA {
21  		@Configuration( id = "moduleA" )
22  		public Set<String> getModuleAConfiguration();
23  	}
24  	
25  	@Module
26  	public interface ModuleB {
27  		@Configuration( id = "moduleB" )
28  		@NotCachable
29  		public Set<String> getModuleBConfiguration();
30  	}
31  	
32  	public static class ModuleAImpl extends AbstractModuleImpl implements ModuleA {
33  
34  		public Set<String> getModuleAConfiguration() {
35  			return new HashSet<String>();
36  		}
37  		
38  		@Contribution( module = ModuleB.class, configuration = "moduleB" )
39  		public void contributeToModuleBConfiguration(Set<String> pConfig) {
40  			pConfig.add("ModuleAWasHere");
41  			mContributed = true;
42  		}
43  	}
44  	
45  	public static abstract class AbstractModuleImpl {
46  		protected boolean mContributed = false;
47  		public boolean hasContributed() {
48  			return mContributed;
49  		}
50  		
51  		public void resetContributed() {
52  			mContributed = false;
53  		}
54  	}
55  	
56  	public static class ModuleBImpl extends AbstractModuleImpl implements ModuleB {
57  
58  		public Set<String> getModuleBConfiguration() {
59  			return new HashSet<String>();
60  		}
61  		
62  		@Contribution( module = ModuleA.class, configuration = "moduleA" )
63  		public void contributeToModuleAConfiguration(Set<String> pConfig) {
64  			pConfig.add("ModuleBWasHere");
65  			mContributed = true;
66  		}
67  	}
68  	
69  	@Test
70  	public void testBasic() {
71  		ContextImpl lContext = new ContextImpl();
72  		lContext.addModule(new ModuleAImpl());
73  		lContext.addModule(new ModuleBImpl());
74  		assertContains(lContext.getModule(ModuleA.class).getModuleAConfiguration(),"ModuleBWasHere");
75  		assertContains(lContext.getModule(ModuleB.class).getModuleBConfiguration(),"ModuleAWasHere");
76  	}
77  	
78  	@Test(dependsOnMethods="testBasic")
79  	public void testCaching() {
80  		ContextImpl lContext = new ContextImpl();
81  		
82  		ModuleAImpl lModuleAImpl = new ModuleAImpl();
83  		ModuleBImpl lModuleBImpl = new ModuleBImpl();
84  		
85  		lContext.addModule(lModuleAImpl);
86  		lContext.addModule(lModuleBImpl);
87  		
88  		assertContains(lContext.getModule(ModuleA.class).getModuleAConfiguration(),"ModuleBWasHere");
89  		assertContains(lContext.getModule(ModuleB.class).getModuleBConfiguration(),"ModuleAWasHere");
90  		
91  		assertTrue(lModuleAImpl.hasContributed(),"ModuleA should have contributed but didn't.");
92  		assertTrue(lModuleBImpl.hasContributed(),"ModuleB should have contributed but didn't.");
93  		
94  		lModuleAImpl.resetContributed(); lModuleBImpl.resetContributed();
95  		
96  		assertContains(lContext.getModule(ModuleA.class).getModuleAConfiguration(),"ModuleBWasHere");
97  		assertContains(lContext.getModule(ModuleB.class).getModuleBConfiguration(),"ModuleAWasHere");
98  		
99  		assertTrue(lModuleAImpl.hasContributed(),"ModuleA should have contributed but didn't.");
100 		assertFalse(lModuleBImpl.hasContributed(),"ModuleB should not have contributed but did.");
101 	}
102 
103 	private void assertContains(Set<String> pModuleAConfiguration, String pString) {
104 		assertTrue(pModuleAConfiguration.contains(pString),"Set did not contain value " + pString);
105 	}
106 	
107 	@Test
108 	public void testBrokenContribution() {
109 		Context lContext = new ContextImpl();
110 		lContext.addModule(new ModuleAImpl());
111 		try {
112 			lContext.addModule(new ModuleBImpl() {
113 				// NOTE INCORRECT CONFIG ID:
114 				@Contribution( module = ModuleA.class, configuration = "moduleANoSuchConfig" ) 
115 				public void contributeToModuleAConfiguration(Set<String> pConfig) {}
116 			});
117 			fail("Expected a unity configuration exception when adding a module that attempts to contribute to a non-existent configuration.");
118 		} catch ( FleetConfigurationException e ) {
119 			// expected.
120 		}
121 	}
122 }