package device.cdPlayer; import device.Device; import device.cdPlayer.exceptions.*; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @ExtendWith(MockitoExtension.class) class CDPlayerTest { @ParameterizedTest @MethodSource("playTestData") void play(String testName, CDPlayer _cdPlayer,Exception exception , String expectedResult) { if(exception!=null){ Exception newException=assertThrows(exception.getClass(),()->_cdPlayer.play()); assertEquals(expectedResult, newException.getMessage()); }else{ assertThat(_cdPlayer.play()).describedAs(testName).isEqualTo(expectedResult); } } static Stream playTestData () { //some PlayLists String[] videoPlayList=new String[]{"Video 01","Video 02","Video 03","Video 04","Video 05"}; String[] audioPlayList=new String[]{"Audio 01","Audio 02","Audio 03","Audio 04","Audio 05"}; //some CDs CD videoCD1=new CD("DVD",videoPlayList); CD videoCD2=new CD("Blue-ray",videoPlayList); CD audioCD1=new CD("Audio",audioPlayList); CD audioCD2=new CD("MP3",audioPlayList); CD audioCD3=new CD("WMA",audioPlayList); CD audioCD4=new CD("AAC",audioPlayList); //some CDPlayers CDPlayer cdPlayer1=new CDPlayer(); CDPlayer cdPlayer2=new CDPlayer(); cdPlayer2.tapOnCdFlap(); cdPlayer2.tapOnCdFlap(); CDPlayer cdPlayer3=new CDPlayer(); cdPlayer3.tapOnCdFlap(); CDPlayer cdPlayer4=new CDPlayer(); cdPlayer4.tapOnCdFlap(); cdPlayer4.setCD(videoCD1); //=================================== CDPlayer cdPlayer5=new CDPlayer(); cdPlayer5.tapOnCdFlap(); cdPlayer5.setCD(videoCD1); cdPlayer5.tapOnCdFlap(); CDPlayer cdPlayer6=new CDPlayer(); cdPlayer6.tapOnCdFlap(); cdPlayer6.setCD(videoCD2); cdPlayer6.tapOnCdFlap(); //=================================== CDPlayer cdPlayer7=new CDPlayer(); cdPlayer7.tapOnCdFlap(); cdPlayer7.setCD(audioCD1); cdPlayer7.tapOnCdFlap(); CDPlayer cdPlayer8=new CDPlayer(); cdPlayer8.tapOnCdFlap(); cdPlayer8.setCD(audioCD2); cdPlayer8.tapOnCdFlap(); CDPlayer cdPlayer9=new CDPlayer(); cdPlayer9.tapOnCdFlap(); cdPlayer9.setCD(audioCD3); cdPlayer9.tapOnCdFlap(); CDPlayer cdPlayer10=new CDPlayer(); cdPlayer10.tapOnCdFlap(); cdPlayer10.setCD(audioCD4); cdPlayer10.tapOnCdFlap(); return Stream.of( Arguments.of("[CdFlap=isClosed , CdDriveContent=>isEmpty] => NoCD", cdPlayer1, new NoCDException(), "CD must be set."), Arguments.of("[CdFlap has been Opened and Closed, CdDriveContent=>isEmpty] => NoCD", cdPlayer2,new NoCDException(),"CD must be set."), Arguments.of("[CdFlap=isOpen , CdDriveContent=>isEmpty] => CdFlapIsOpen", cdPlayer3,new CdFlapIsOpenException(),"Cd Flap must be closed."), Arguments.of("[CdFlap=isOpen , CdDriveContent=>isSet] => CdFlapIsOpen", cdPlayer4,new CdFlapIsOpenException(),"Cd Flap must be closed."), Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>DVD] => FormatNotSupported",cdPlayer5,new FormatNotSupportedException(),"Cd-Format not supported."), Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>Blue-ray] => FormatNotSupported",cdPlayer6, new FormatNotSupportedException(),"Cd-Format not supported."), Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>Audio] => AllConditionsForPlayMet", cdPlayer7,null,"AllConditionsForPlayMet"), Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>MP3] => AllConditionsForPlayMet", cdPlayer8,null,"AllConditionsForPlayMet"), Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>WMA] => AllConditionsForPlayMet", cdPlayer9,null,"AllConditionsForPlayMet"), Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>AAC] => AllConditionsForPlayMet", cdPlayer10,null,"AllConditionsForPlayMet") ); } @ParameterizedTest @MethodSource("louderTestData") void louderTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, int expectedResult) { for (int i = 0; i < anzClicks; i++) { _cdPlayer.louder(); } if(testDirection.equals("VolumeIncreased")){ assertThat(_cdPlayer.getVolume()).describedAs(testName).isEqualTo(expectedResult); } if(testDirection.equals("VolumeHasChanged")){ assertThat(_cdPlayer.getVolume()).describedAs(testName).isNotEqualTo(expectedResult); }if(testDirection.equals("VolumeNotDecreased")){ assertThat(_cdPlayer.getVolume()).describedAs(testName).isNotEqualTo(expectedResult); } } static Stream louderTestData () { CDPlayer cdPlayer=new CDPlayer(); return Stream.of( Arguments.of("[getVolume() after 20x louder() ] => VolumeIncreased","VolumeIncreased", cdPlayer, 20, 20), Arguments.of("[getVolume() after 2x louder() ] => VolumeHasChanged","VolumeHasChanged" ,cdPlayer,2,0), Arguments.of("[getVolume() after 5x louder() ] => VolumeDecreased","VolumeNotDecreased", cdPlayer,5,-5) ); } @ParameterizedTest @MethodSource("quieterTestData") void quieterTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, int expectedResult) { for (int i = 0; i < anzClicks; i++) { _cdPlayer.quieter(); } if(testDirection.equals("VolumeDecreased")){ for (int i = 0; i < 20; i++) { _cdPlayer.louder(); } for (int i = 0; i < anzClicks; i++) { _cdPlayer.quieter(); } assertThat(_cdPlayer.getVolume()).describedAs(testName).isEqualTo(expectedResult); } if(testDirection.equals("VolumeHasNotChanged")){ assertThat(_cdPlayer.getVolume()).describedAs(testName).isEqualTo(expectedResult); }if(testDirection.equals("VolumeNotIncreased")){ assertThat(_cdPlayer.getVolume()).describedAs(testName).isNotEqualTo(expectedResult); } } static Stream quieterTestData () { CDPlayer cdPlayer=new CDPlayer(); return Stream.of( Arguments.of("[getVolume() after 20x quieter() starting by 20] => VolumeHasDecreased","VolumeDecreased", cdPlayer, 19, 1), Arguments.of("[getVolume() after 20x quieter() starting by 0] => VolumeHasNotChanged","VolumeHasNotChanged" ,cdPlayer,20,0), Arguments.of("[getVolume() after 5x quieter() starting by 0] => VolumeNotIncreased","VolumeNotIncreased", cdPlayer,5,5) ); } @ParameterizedTest @MethodSource("nextTestData") void nextTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, String expectedResult){ if(testDirection.equals("SecondSongSelected")|| testDirection.equals("ThirdSongSelected")){ for (int i = 0; i < anzClicks; i++) { _cdPlayer.next(); } assertThat(_cdPlayer.getActualPlayTrack()).describedAs(testName).isEqualTo(expectedResult); } if(testDirection.equals("FirstSongSelected")){ for (int i = 0; i nextTestData () { String[] audioPlayList=new String[]{"Audio 01","Audio 02","Audio 03","Audio 04","Audio 05"}; CD audioCD=new CD("Audio",audioPlayList); CDPlayer cdPlayer1=new CDPlayer(); cdPlayer1.tapOnCdFlap(); cdPlayer1.setCD(audioCD); cdPlayer1.tapOnCdFlap(); CDPlayer cdPlayer2=new CDPlayer(); cdPlayer2.tapOnCdFlap(); cdPlayer2.setCD(audioCD); cdPlayer2.tapOnCdFlap(); CDPlayer cdPlayer3=new CDPlayer(); cdPlayer3.tapOnCdFlap(); cdPlayer3.setCD(audioCD); cdPlayer3.tapOnCdFlap(); return Stream.of( Arguments.of("[getActualPlayTrack() after 1x next() starting by firstSong] => SecondSongSelected","SecondSongSelected", cdPlayer1, 1, cdPlayer1.getSongByNumber(1)), Arguments.of("[getActualPlayTrack() after 2x next() starting by firstSong] => ThirdSongSelected","ThirdSongSelected" ,cdPlayer2,2,cdPlayer2.getSongByNumber(2)), Arguments.of("[getActualPlayTrack() after 1x next() starting by lastSong] => FirstSongSelected","FirstSongSelected", cdPlayer3,cdPlayer3.getItemList().length,cdPlayer3.getSongByNumber(0)) ); } @ParameterizedTest @MethodSource("prevTestData") void prevTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, String expectedResult){ if(testDirection.equals("StartingBySecondSong")) { _cdPlayer.next(); } if(testDirection.equals("StartingByThirdSong")) { _cdPlayer.next(); _cdPlayer.next(); } for (int i = 0; i < anzClicks; i++) { _cdPlayer.prev(); } assertThat(_cdPlayer.getActualPlayTrack()).describedAs(testName).isEqualTo(expectedResult); } static Stream prevTestData () { String[] audioPlayList = new String[]{"Audio 01", "Audio 02", "Audio 03", "Audio 04", "Audio 05"}; CD audioCD = new CD("Audio", audioPlayList); CDPlayer cdPlayer1 = new CDPlayer(); cdPlayer1.tapOnCdFlap(); cdPlayer1.setCD(audioCD); cdPlayer1.tapOnCdFlap(); return Stream.of( Arguments.of("[getActualPlayTrack() after 1x prev() starting by secondSong] => FirstSongSelected", "StartingBySecondSong", cdPlayer1, 1, cdPlayer1.getSongByNumber(0)), Arguments.of("[getActualPlayTrack() after 2x prev() starting by thirdSong] => FirstSongSelected", "StartingByThirdSong", cdPlayer1, 2, cdPlayer1.getSongByNumber(0)), Arguments.of("[getActualPlayTrack() after 1x prev() starting by firstSong] => FirstSongSelected", "StartingByFirstSong", cdPlayer1, 1, cdPlayer1.getSongByNumber(0)) ); } @ParameterizedTest @MethodSource("getOptionsTestData") void getOptionsTest(String testName,String testDirection, CDPlayer _cdPlayer){ if(testDirection.equals("ReturnValueNotNull")) { assertThat(_cdPlayer.getOptions()).describedAs(testName).isNotEqualTo(null); } if(testDirection.equals("ArrayLengthGreaterThen0")) { assertThat(_cdPlayer.getOptions().length).describedAs(testName).isNotEqualTo(0); } if(testDirection.equals("ArrayContainsInterfaceMethods")) { Method[]interfaceMethods=Device.class.getDeclaredMethods(); List deviceMethods = new ArrayList(Arrays.asList(_cdPlayer.getOptions())); for (int i = 0; i < interfaceMethods.length; i++) { assertThat(deviceMethods.contains(interfaceMethods[i].getName())).describedAs(testName).isEqualTo(true); } } } static Stream getOptionsTestData () { CDPlayer cdPlayer1 = new CDPlayer(); return Stream.of( Arguments.of("[getOptions(): shouldNotReturnNull] => ReturnValueNotNull", "ReturnValueNotNull", cdPlayer1), Arguments.of("[getOptions(): shouldReturnAnArrayWithLengthGreaterThen0] => ArrayLengthGreaterThen0", "ArrayLengthGreaterThen0", cdPlayer1), Arguments.of("[getOptions(): shouldReturnAnArrayWithInAllInterfaceMethods] => ArrayContainsInterfaceMethods", "ArrayContainsInterfaceMethods", cdPlayer1) ); } @Test void getVolumeReturnValueBetween0And100(){ CDPlayer cdPlayer1 = new CDPlayer(); boolean volumeIstInValueRange=false; int volume=cdPlayer1.getVolume(); if(volume>=0 && volume <=100){ volumeIstInValueRange=true; } assertThat(volumeIstInValueRange).isEqualTo(true); } }