44
55import io .github .blueprintplatform .codegen .application .port .out .artifact .ArtifactKey ;
66import io .github .blueprintplatform .codegen .domain .model .ProjectBlueprint ;
7- import io .github .blueprintplatform .codegen .domain .model .value .architecture .ArchitectureGovernance ;
87import io .github .blueprintplatform .codegen .domain .model .value .architecture .ArchitectureSpec ;
98import io .github .blueprintplatform .codegen .domain .model .value .dependency .Dependencies ;
109import io .github .blueprintplatform .codegen .domain .model .value .identity .ArtifactId ;
2625import io .github .blueprintplatform .codegen .domain .model .value .tech .stack .TechStack ;
2726import io .github .blueprintplatform .codegen .domain .port .out .artifact .GeneratedDirectory ;
2827import io .github .blueprintplatform .codegen .domain .port .out .artifact .GeneratedResource ;
28+ import io .github .blueprintplatform .codegen .domain .port .out .artifact .GeneratedTextResource ;
2929import java .nio .file .Path ;
3030import java .util .ArrayList ;
3131import java .util .List ;
@@ -54,57 +54,55 @@ private static ProjectBlueprint blueprint(ProjectLayout layout) {
5454 new TechStack (Framework .SPRING_BOOT , BuildTool .MAVEN , Language .JAVA ),
5555 new SpringBootJvmTarget (JavaVersion .JAVA_21 , SpringBootVersion .V3_5 ));
5656
57- ArchitectureSpec architecture =
58- new ArchitectureSpec (layout , ArchitectureGovernance .none (), SampleCodeOptions .none ());
57+ ArchitectureSpec architecture = new ArchitectureSpec (layout , null , SampleCodeOptions .none ());
5958
6059 Dependencies dependencies = Dependencies .of (List .of ());
6160
6261 return ProjectBlueprint .of (metadata , platform , architecture , dependencies );
6362 }
6463
65- private static List <Path > toRelativePaths (Iterable <? extends GeneratedResource > resources ) {
64+ private static List <Path > directoriesOf (Iterable <? extends GeneratedResource > resources ) {
6665 List <Path > result = new ArrayList <>();
6766 StreamSupport .stream (resources .spliterator (), false )
68- .forEach (
69- r -> {
70- assertThat (r ).isInstanceOf (GeneratedDirectory .class );
71- result .add (r .relativePath ());
72- });
67+ .filter (r -> r instanceof GeneratedDirectory )
68+ .forEach (r -> result .add (r .relativePath ()));
69+ return result ;
70+ }
71+
72+ private static List <Path > textFilesOf (Iterable <? extends GeneratedResource > resources ) {
73+ List <Path > result = new ArrayList <>();
74+ StreamSupport .stream (resources .spliterator (), false )
75+ .filter (r -> r instanceof GeneratedTextResource )
76+ .forEach (r -> result .add (r .relativePath ()));
7377 return result ;
7478 }
7579
7680 @ Test
7781 @ DisplayName ("artifactKey() should return SOURCE_LAYOUT" )
7882 void artifactKey_shouldReturnSourceLayout () {
7983 SourceLayoutAdapter adapter = new SourceLayoutAdapter ();
80-
8184 assertThat (adapter .artifactKey ()).isEqualTo (ArtifactKey .SOURCE_LAYOUT );
8285 }
8386
8487 @ Test
85- @ DisplayName (
86- "generate() with STANDARD layout should create base/package directories and layered sub-packages" )
87- void generate_standardLayout_shouldCreateLayeredSubPackages () {
88+ @ DisplayName ("generate() with STANDARD layout should create directories and package-info markers" )
89+ void generate_standardLayout_shouldCreateLayeredSubPackagesAndMarkers () {
8890 SourceLayoutAdapter adapter = new SourceLayoutAdapter ();
8991 ProjectBlueprint blueprint = blueprint (ProjectLayout .STANDARD );
9092
9193 Iterable <? extends GeneratedResource > resources = adapter .generate (blueprint );
92- List <Path > paths = toRelativePaths (resources );
9394
9495 Path mainBase = Path .of ("src" , "main" , "java" ).resolve (BASE_PACKAGE_PATH );
9596 Path testBase = Path .of ("src" , "test" , "java" ).resolve (BASE_PACKAGE_PATH );
9697
97- List <Path > expected =
98+ List <Path > expectedDirs =
9899 List .of (
99- // common dirs
100100 Path .of ("src" , "main" , "java" ),
101101 Path .of ("src" , "test" , "java" ),
102102 Path .of ("src" , "main" , "resources" ),
103103 Path .of ("src" , "test" , "resources" ),
104- // base package dirs
105104 mainBase ,
106105 testBase ,
107- // standard layered sub-packages (under main base package only)
108106 mainBase .resolve ("controller" ),
109107 mainBase .resolve (Path .of ("controller" , "dto" )),
110108 mainBase .resolve ("service" ),
@@ -114,33 +112,38 @@ void generate_standardLayout_shouldCreateLayeredSubPackages() {
114112 mainBase .resolve (Path .of ("domain" , "model" )),
115113 mainBase .resolve (Path .of ("domain" , "service" )));
116114
117- assertThat (paths ).containsExactlyInAnyOrderElementsOf (expected ).hasSize (expected .size ());
115+ List <Path > expectedMarkers =
116+ List .of (
117+ mainBase .resolve (Path .of ("controller" , "package-info.java" )),
118+ mainBase .resolve (Path .of ("service" , "package-info.java" )),
119+ mainBase .resolve (Path .of ("repository" , "package-info.java" )),
120+ mainBase .resolve (Path .of ("domain" , "package-info.java" )),
121+ mainBase .resolve (Path .of ("config" , "package-info.java" )));
122+
123+ assertThat (directoriesOf (resources )).containsExactlyInAnyOrderElementsOf (expectedDirs );
124+ assertThat (textFilesOf (resources )).containsExactlyInAnyOrderElementsOf (expectedMarkers );
118125 }
119126
120127 @ Test
121128 @ DisplayName (
122- "generate() with HEXAGONAL layout should create base/package directories and hexagonal sub-packages " )
123- void generate_hexagonalLayout_shouldCreateHexagonalSubPackages () {
129+ "generate() with HEXAGONAL layout should create directories and package-info markers " )
130+ void generate_hexagonalLayout_shouldCreateHexagonalSubPackagesAndMarkers () {
124131 SourceLayoutAdapter adapter = new SourceLayoutAdapter ();
125132 ProjectBlueprint blueprint = blueprint (ProjectLayout .HEXAGONAL );
126133
127134 Iterable <? extends GeneratedResource > resources = adapter .generate (blueprint );
128- List <Path > paths = toRelativePaths (resources );
129135
130136 Path mainBase = Path .of ("src" , "main" , "java" ).resolve (BASE_PACKAGE_PATH );
131137 Path testBase = Path .of ("src" , "test" , "java" ).resolve (BASE_PACKAGE_PATH );
132138
133- List <Path > expected =
139+ List <Path > expectedDirs =
134140 List .of (
135- // common dirs
136141 Path .of ("src" , "main" , "java" ),
137142 Path .of ("src" , "test" , "java" ),
138143 Path .of ("src" , "main" , "resources" ),
139144 Path .of ("src" , "test" , "resources" ),
140- // base package dirs
141145 mainBase ,
142146 testBase ,
143- // hexagonal sub-packages (under main base package only)
144147 mainBase .resolve ("adapter" ),
145148 mainBase .resolve (Path .of ("adapter" , "in" )),
146149 mainBase .resolve (Path .of ("adapter" , "out" )),
@@ -157,6 +160,14 @@ void generate_hexagonalLayout_shouldCreateHexagonalSubPackages() {
157160 mainBase .resolve (Path .of ("domain" , "port" , "out" )),
158161 mainBase .resolve (Path .of ("domain" , "service" )));
159162
160- assertThat (paths ).containsExactlyInAnyOrderElementsOf (expected ).hasSize (expected .size ());
163+ List <Path > expectedMarkers =
164+ List .of (
165+ mainBase .resolve (Path .of ("adapter" , "package-info.java" )),
166+ mainBase .resolve (Path .of ("application" , "package-info.java" )),
167+ mainBase .resolve (Path .of ("domain" , "package-info.java" )),
168+ mainBase .resolve (Path .of ("bootstrap" , "package-info.java" )));
169+
170+ assertThat (directoriesOf (resources )).containsExactlyInAnyOrderElementsOf (expectedDirs );
171+ assertThat (textFilesOf (resources )).containsExactlyInAnyOrderElementsOf (expectedMarkers );
161172 }
162173}
0 commit comments