3232
3333import java .io .File ;
3434import java .util .List ;
35- import java .util .Locale ;
3635import java .util .logging .Level ;
3736import java .util .logging .Logger ;
3837
3938import static org .assertj .core .api .Assertions .assertThat ;
4039import static org .assertj .core .api .Assertions .assertThatCode ;
40+ import static org .junit .jupiter .api .Assertions .assertFalse ;
41+ import static org .junit .jupiter .api .Assertions .assertTrue ;
4142
4243@ ExtendWith (LoggingExtension .class )
4344class ExecOperationTest {
4445 private static final String BAR = "bar" ;
4546 private static final String CAT_COMMAND = "cat" ;
4647 private static final String ECHO_COMMAND = "echo" ;
4748 private static final String FOO = "foo" ;
48- private static final boolean IS_WINDOWS = System .getProperty ("os.name" ).toLowerCase (Locale .US ).contains ("win" );
4949
5050 @ SuppressWarnings ("LoggerInitializedWithForeignClass" )
5151 private static final Logger LOGGER = Logger .getLogger (ExecOperation .class .getName ());
@@ -73,7 +73,7 @@ private ExecOperation createBasicExecOperation() {
7373 }
7474
7575 private List <String > getPlatformSpecificCommand (List <String > windowsCommand , List <String > unixCommand ) {
76- return IS_WINDOWS ? windowsCommand : unixCommand ;
76+ return ExecOperation . isWindows () ? windowsCommand : unixCommand ;
7777 }
7878
7979 @ Nested
@@ -309,4 +309,153 @@ void workDirAsString() {
309309 .doesNotThrowAnyException ();
310310 }
311311 }
312+
313+ @ Nested
314+ @ DisplayName ("OS Tests" )
315+ class OsTests {
316+ @ Nested
317+ @ DisplayName ("OS Detection Tests" )
318+ class OsDetectionTests {
319+ @ Test
320+ @ EnabledOnOs (OS .LINUX )
321+ void verifyIsLinux () {
322+ assertTrue (ExecOperation .isLinux ());
323+ assertFalse (ExecOperation .isWindows ());
324+ assertFalse (ExecOperation .isMacOS ());
325+ }
326+
327+ @ Test
328+ @ EnabledOnOs (OS .MAC )
329+ void verifyIsMacOS () {
330+ assertTrue (ExecOperation .isMacOS ());
331+ assertFalse (ExecOperation .isLinux ());
332+ assertFalse (ExecOperation .isWindows ());
333+ }
334+
335+ @ Test
336+ @ EnabledOnOs (OS .WINDOWS )
337+ void verifyIsWindows () {
338+ assertTrue (ExecOperation .isWindows ());
339+ assertFalse (ExecOperation .isLinux ());
340+ assertFalse (ExecOperation .isMacOS ());
341+ }
342+ }
343+
344+ @ Nested
345+ @ DisplayName ("Linux Detection Tests" )
346+ class LinuxDetectionTests {
347+ @ Test
348+ void detectsLinux () {
349+ assertTrue (ExecOperation .isLinux ("Linux" ));
350+ }
351+
352+ @ Test
353+ void detectsUnix () {
354+ assertTrue (ExecOperation .isLinux ("Unix" ));
355+ }
356+
357+ @ Test
358+ void detectsLinuxCaseInsensitive () {
359+ assertTrue (ExecOperation .isLinux ("linux" ));
360+ }
361+
362+ @ Test
363+ void detectsUnixVariants () {
364+ assertTrue (ExecOperation .isLinux ("freebsd unix" ));
365+ }
366+
367+ @ Test
368+ void rejectsNonLinux () {
369+ assertFalse (ExecOperation .isLinux ("Windows 10" ));
370+ assertFalse (ExecOperation .isLinux ("Mac OS X" ));
371+ }
372+ }
373+
374+ @ Nested
375+ @ DisplayName ("MacOS Detection Tests" )
376+ class MacOSDetectionTests {
377+ @ Test
378+ void detectsMacOSX () {
379+ assertTrue (ExecOperation .isMacOS ("Mac OS X" ));
380+ }
381+
382+ @ Test
383+ void detectsMacOS () {
384+ assertTrue (ExecOperation .isMacOS ("macOS" ));
385+ }
386+
387+ @ Test
388+ void detectsDarwin () {
389+ assertTrue (ExecOperation .isMacOS ("Darwin" ));
390+ }
391+
392+ @ Test
393+ void detectsMacCaseInsensitive () {
394+ assertTrue (ExecOperation .isMacOS ("MAC OS X" ));
395+ assertTrue (ExecOperation .isMacOS ("MACOS" ));
396+ }
397+
398+ @ Test
399+ void rejectsNonMac () {
400+ assertFalse (ExecOperation .isMacOS ("Windows 10" ));
401+ assertFalse (ExecOperation .isMacOS ("Linux" ));
402+ }
403+ }
404+
405+ @ Nested
406+ @ DisplayName ("Windows Detection Tests" )
407+ class WindowsDetectionTests {
408+ @ Test
409+ void detectsWindows () {
410+ assertTrue (ExecOperation .isWindows ("windows 10" ));
411+ }
412+
413+ @ Test
414+ void detectsWindows11 () {
415+ assertTrue (ExecOperation .isWindows ("windows 11" ));
416+ }
417+
418+ @ Test
419+ void detectsWindowsServer () {
420+ assertTrue (ExecOperation .isWindows ("windows server 2022" ));
421+ }
422+
423+ @ Test
424+ void detectsWindowsCaseInsensitive () {
425+ assertTrue (ExecOperation .isWindows ("windows" ));
426+ }
427+
428+ @ Test
429+ void rejectsNonWindows () {
430+ assertFalse (ExecOperation .isWindows ("Mac OS X" ));
431+ assertFalse (ExecOperation .isWindows ("Linux" ));
432+ assertFalse (ExecOperation .isWindows ("darwin" )); // "win" should not match "darwin"
433+ }
434+ }
435+
436+ @ Nested
437+ @ DisplayName ("Edge Cases Tests" )
438+ class EdgeCaseTests {
439+ @ Test
440+ void handlesEmptyOsName () {
441+ assertFalse (ExecOperation .isLinux ("" ));
442+ assertFalse (ExecOperation .isMacOS ("" ));
443+ assertFalse (ExecOperation .isWindows ("" ));
444+ }
445+
446+ @ Test
447+ void handlesUnknownOS () {
448+ assertFalse (ExecOperation .isLinux ("someunknownos" ));
449+ assertFalse (ExecOperation .isMacOS ("someunknownos" ));
450+ assertFalse (ExecOperation .isWindows ("someunknownos" ));
451+ }
452+
453+ @ Test
454+ void handlesPartialMatches () {
455+ assertFalse (ExecOperation .isWindows ("darwin" ));
456+ assertFalse (ExecOperation .isMacOS ("linux" ));
457+ assertFalse (ExecOperation .isLinux ("windows" ));
458+ }
459+ }
460+ }
312461}
0 commit comments