Project for Continous Integration
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

292 lines
13 KiB

  1. package device.cdPlayer;
  2. import device.Device;
  3. import device.cdPlayer.exceptions.*;
  4. import org.junit.jupiter.api.Test;
  5. import org.junit.jupiter.api.extension.ExtendWith;
  6. import org.junit.jupiter.params.ParameterizedTest;
  7. import org.junit.jupiter.params.provider.Arguments;
  8. import org.junit.jupiter.params.provider.MethodSource;
  9. import org.mockito.Mockito;
  10. import org.mockito.junit.jupiter.MockitoExtension;
  11. import java.lang.reflect.Method;
  12. import java.util.ArrayList;
  13. import java.util.Arrays;
  14. import java.util.List;
  15. import java.util.stream.Stream;
  16. import static org.assertj.core.api.Assertions.assertThat;
  17. import static org.junit.jupiter.api.Assertions.*;
  18. import static org.mockito.Mockito.when;
  19. @ExtendWith(MockitoExtension.class)
  20. class CDPlayerTest {
  21. @ParameterizedTest
  22. @MethodSource("playTestData")
  23. void play(String testName, CDPlayer _cdPlayer,Exception exception , String expectedResult) {
  24. if(exception!=null){
  25. Exception newException=assertThrows(exception.getClass(),()->_cdPlayer.play());
  26. assertEquals(expectedResult, newException.getMessage());
  27. }else{
  28. assertThat(_cdPlayer.play()).describedAs(testName).isEqualTo(expectedResult);
  29. }
  30. }
  31. static Stream<Arguments> playTestData () {
  32. //some PlayLists
  33. String[] videoPlayList=new String[]{"Video 01","Video 02","Video 03","Video 04","Video 05"};
  34. String[] audioPlayList=new String[]{"Audio 01","Audio 02","Audio 03","Audio 04","Audio 05"};
  35. //some CDs
  36. CD videoCD1=new CD("DVD",videoPlayList);
  37. CD videoCD2=new CD("Blue-ray",videoPlayList);
  38. CD audioCD1=new CD("Audio",audioPlayList);
  39. CD audioCD2=new CD("MP3",audioPlayList);
  40. CD audioCD3=new CD("WMA",audioPlayList);
  41. CD audioCD4=new CD("AAC",audioPlayList);
  42. //some CDPlayers
  43. CDPlayer cdPlayer1=new CDPlayer();
  44. CDPlayer cdPlayer2=new CDPlayer();
  45. cdPlayer2.tapOnCdFlap();
  46. cdPlayer2.tapOnCdFlap();
  47. CDPlayer cdPlayer3=new CDPlayer();
  48. cdPlayer3.tapOnCdFlap();
  49. CDPlayer cdPlayer4=new CDPlayer();
  50. cdPlayer4.tapOnCdFlap();
  51. cdPlayer4.setCD(videoCD1);
  52. //===================================
  53. CDPlayer cdPlayer5=new CDPlayer();
  54. cdPlayer5.tapOnCdFlap();
  55. cdPlayer5.setCD(videoCD1);
  56. cdPlayer5.tapOnCdFlap();
  57. CDPlayer cdPlayer6=new CDPlayer();
  58. cdPlayer6.tapOnCdFlap();
  59. cdPlayer6.setCD(videoCD2);
  60. cdPlayer6.tapOnCdFlap();
  61. //===================================
  62. CDPlayer cdPlayer7=new CDPlayer();
  63. cdPlayer7.tapOnCdFlap();
  64. cdPlayer7.setCD(audioCD1);
  65. cdPlayer7.tapOnCdFlap();
  66. CDPlayer cdPlayer8=new CDPlayer();
  67. cdPlayer8.tapOnCdFlap();
  68. cdPlayer8.setCD(audioCD2);
  69. cdPlayer8.tapOnCdFlap();
  70. CDPlayer cdPlayer9=new CDPlayer();
  71. cdPlayer9.tapOnCdFlap();
  72. cdPlayer9.setCD(audioCD3);
  73. cdPlayer9.tapOnCdFlap();
  74. CDPlayer cdPlayer10=new CDPlayer();
  75. cdPlayer10.tapOnCdFlap();
  76. cdPlayer10.setCD(audioCD4);
  77. cdPlayer10.tapOnCdFlap();
  78. return Stream.of(
  79. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isEmpty] => NoCD", cdPlayer1, new NoCDException(), "CD must be set."),
  80. Arguments.of("[CdFlap has been Opened and Closed, CdDriveContent=>isEmpty] => NoCD", cdPlayer2,new NoCDException(),"CD must be set."),
  81. Arguments.of("[CdFlap=isOpen , CdDriveContent=>isEmpty] => CdFlapIsOpen", cdPlayer3,new CdFlapIsOpenException(),"Cd Flap must be closed."),
  82. Arguments.of("[CdFlap=isOpen , CdDriveContent=>isSet] => CdFlapIsOpen", cdPlayer4,new CdFlapIsOpenException(),"Cd Flap must be closed."),
  83. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>DVD] => FormatNotSupported",cdPlayer5,new FormatNotSupportedException(),"Cd-Format not supported."),
  84. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>Blue-ray] => FormatNotSupported",cdPlayer6, new FormatNotSupportedException(),"Cd-Format not supported."),
  85. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>Audio] => AllConditionsForPlayMet", cdPlayer7,null,"AllConditionsForPlayMet"),
  86. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>MP3] => AllConditionsForPlayMet", cdPlayer8,null,"AllConditionsForPlayMet"),
  87. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>WMA] => AllConditionsForPlayMet", cdPlayer9,null,"AllConditionsForPlayMet"),
  88. Arguments.of("[CdFlap=isClosed , CdDriveContent=>isSet, CdFormat=>AAC] => AllConditionsForPlayMet", cdPlayer10,null,"AllConditionsForPlayMet")
  89. );
  90. }
  91. @ParameterizedTest
  92. @MethodSource("louderTestData")
  93. void louderTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, int expectedResult) {
  94. for (int i = 0; i < anzClicks; i++) {
  95. _cdPlayer.louder();
  96. }
  97. if(testDirection.equals("VolumeIncreased")){
  98. assertThat(_cdPlayer.getVolume()).describedAs(testName).isEqualTo(expectedResult);
  99. }
  100. if(testDirection.equals("VolumeHasChanged")){
  101. assertThat(_cdPlayer.getVolume()).describedAs(testName).isNotEqualTo(expectedResult);
  102. }if(testDirection.equals("VolumeNotDecreased")){
  103. assertThat(_cdPlayer.getVolume()).describedAs(testName).isNotEqualTo(expectedResult);
  104. }
  105. }
  106. static Stream<Arguments> louderTestData () {
  107. CDPlayer cdPlayer=new CDPlayer();
  108. return Stream.of(
  109. Arguments.of("[getVolume() after 20x louder() ] => VolumeIncreased","VolumeIncreased", cdPlayer, 20, 20),
  110. Arguments.of("[getVolume() after 2x louder() ] => VolumeHasChanged","VolumeHasChanged" ,cdPlayer,2,0),
  111. Arguments.of("[getVolume() after 5x louder() ] => VolumeDecreased","VolumeNotDecreased", cdPlayer,5,-5)
  112. );
  113. }
  114. @ParameterizedTest
  115. @MethodSource("quieterTestData")
  116. void quieterTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, int expectedResult) {
  117. for (int i = 0; i < anzClicks; i++) {
  118. _cdPlayer.quieter();
  119. }
  120. if(testDirection.equals("VolumeDecreased")){
  121. for (int i = 0; i < 20; i++) {
  122. _cdPlayer.louder();
  123. }
  124. for (int i = 0; i < anzClicks; i++) {
  125. _cdPlayer.quieter();
  126. }
  127. assertThat(_cdPlayer.getVolume()).describedAs(testName).isEqualTo(expectedResult);
  128. }
  129. if(testDirection.equals("VolumeHasNotChanged")){
  130. assertThat(_cdPlayer.getVolume()).describedAs(testName).isEqualTo(expectedResult);
  131. }if(testDirection.equals("VolumeNotIncreased")){
  132. assertThat(_cdPlayer.getVolume()).describedAs(testName).isNotEqualTo(expectedResult);
  133. }
  134. }
  135. static Stream<Arguments> quieterTestData () {
  136. CDPlayer cdPlayer=new CDPlayer();
  137. return Stream.of(
  138. Arguments.of("[getVolume() after 20x quieter() starting by 20] => VolumeHasDecreased","VolumeDecreased", cdPlayer, 19, 1),
  139. Arguments.of("[getVolume() after 20x quieter() starting by 0] => VolumeHasNotChanged","VolumeHasNotChanged" ,cdPlayer,20,0),
  140. Arguments.of("[getVolume() after 5x quieter() starting by 0] => VolumeNotIncreased","VolumeNotIncreased", cdPlayer,5,5)
  141. );
  142. }
  143. @ParameterizedTest
  144. @MethodSource("nextTestData")
  145. void nextTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, String expectedResult){
  146. if(testDirection.equals("SecondSongSelected")|| testDirection.equals("ThirdSongSelected")){
  147. for (int i = 0; i < anzClicks; i++) {
  148. _cdPlayer.next();
  149. }
  150. assertThat(_cdPlayer.getActualPlayTrack()).describedAs(testName).isEqualTo(expectedResult);
  151. }
  152. if(testDirection.equals("FirstSongSelected")){
  153. for (int i = 0; i <anzClicks; i++) {
  154. _cdPlayer.next();
  155. }
  156. assertThat(_cdPlayer.getActualPlayTrack()).describedAs(testName).isEqualTo(expectedResult);
  157. }
  158. }
  159. static Stream<Arguments> nextTestData () {
  160. String[] audioPlayList=new String[]{"Audio 01","Audio 02","Audio 03","Audio 04","Audio 05"};
  161. CD audioCD=new CD("Audio",audioPlayList);
  162. CDPlayer cdPlayer1=new CDPlayer();
  163. cdPlayer1.tapOnCdFlap();
  164. cdPlayer1.setCD(audioCD);
  165. cdPlayer1.tapOnCdFlap();
  166. CDPlayer cdPlayer2=new CDPlayer();
  167. cdPlayer2.tapOnCdFlap();
  168. cdPlayer2.setCD(audioCD);
  169. cdPlayer2.tapOnCdFlap();
  170. CDPlayer cdPlayer3=new CDPlayer();
  171. cdPlayer3.tapOnCdFlap();
  172. cdPlayer3.setCD(audioCD);
  173. cdPlayer3.tapOnCdFlap();
  174. return Stream.of(
  175. Arguments.of("[getActualPlayTrack() after 1x next() starting by firstSong] => SecondSongSelected","SecondSongSelected", cdPlayer1, 1, cdPlayer1.getSongByNumber(1)),
  176. Arguments.of("[getActualPlayTrack() after 2x next() starting by firstSong] => ThirdSongSelected","ThirdSongSelected" ,cdPlayer2,2,cdPlayer2.getSongByNumber(2)),
  177. Arguments.of("[getActualPlayTrack() after 1x next() starting by lastSong] => FirstSongSelected","FirstSongSelected", cdPlayer3,cdPlayer3.getItemList().length,cdPlayer3.getSongByNumber(0))
  178. );
  179. }
  180. @ParameterizedTest
  181. @MethodSource("prevTestData")
  182. void prevTest(String testName,String testDirection, CDPlayer _cdPlayer,int anzClicks, String expectedResult){
  183. if(testDirection.equals("StartingBySecondSong")) {
  184. _cdPlayer.next();
  185. }
  186. if(testDirection.equals("StartingByThirdSong")) {
  187. _cdPlayer.next();
  188. _cdPlayer.next();
  189. }
  190. for (int i = 0; i < anzClicks; i++) {
  191. _cdPlayer.prev();
  192. }
  193. assertThat(_cdPlayer.getActualPlayTrack()).describedAs(testName).isEqualTo(expectedResult);
  194. }
  195. static Stream<Arguments> prevTestData () {
  196. String[] audioPlayList = new String[]{"Audio 01", "Audio 02", "Audio 03", "Audio 04", "Audio 05"};
  197. CD audioCD = new CD("Audio", audioPlayList);
  198. CDPlayer cdPlayer1 = new CDPlayer();
  199. cdPlayer1.tapOnCdFlap();
  200. cdPlayer1.setCD(audioCD);
  201. cdPlayer1.tapOnCdFlap();
  202. return Stream.of(
  203. Arguments.of("[getActualPlayTrack() after 1x prev() starting by secondSong] => FirstSongSelected", "StartingBySecondSong", cdPlayer1, 1, cdPlayer1.getSongByNumber(0)),
  204. Arguments.of("[getActualPlayTrack() after 2x prev() starting by thirdSong] => FirstSongSelected", "StartingByThirdSong", cdPlayer1, 2, cdPlayer1.getSongByNumber(0)),
  205. Arguments.of("[getActualPlayTrack() after 1x prev() starting by firstSong] => FirstSongSelected", "StartingByFirstSong", cdPlayer1, 1, cdPlayer1.getSongByNumber(0))
  206. );
  207. }
  208. @ParameterizedTest
  209. @MethodSource("getOptionsTestData")
  210. void getOptionsTest(String testName,String testDirection, CDPlayer _cdPlayer){
  211. if(testDirection.equals("ReturnValueNotNull")) {
  212. assertThat(_cdPlayer.getOptions()).describedAs(testName).isNotEqualTo(null);
  213. }
  214. if(testDirection.equals("ArrayLengthGreaterThen0")) {
  215. assertThat(_cdPlayer.getOptions().length).describedAs(testName).isNotEqualTo(0);
  216. }
  217. if(testDirection.equals("ArrayContainsInterfaceMethods")) {
  218. Method[]interfaceMethods=Device.class.getDeclaredMethods();
  219. List<String> deviceMethods = new ArrayList<String>(Arrays.asList(_cdPlayer.getOptions()));
  220. for (int i = 0; i < interfaceMethods.length; i++) {
  221. assertThat(deviceMethods.contains(interfaceMethods[i].getName())).describedAs(testName).isEqualTo(true);
  222. }
  223. }
  224. }
  225. static Stream<Arguments> getOptionsTestData () {
  226. CDPlayer cdPlayer1 = new CDPlayer();
  227. return Stream.of(
  228. Arguments.of("[getOptions(): shouldNotReturnNull] => ReturnValueNotNull", "ReturnValueNotNull", cdPlayer1),
  229. Arguments.of("[getOptions(): shouldReturnAnArrayWithLengthGreaterThen0] => ArrayLengthGreaterThen0", "ArrayLengthGreaterThen0", cdPlayer1),
  230. Arguments.of("[getOptions(): shouldReturnAnArrayWithInAllInterfaceMethods] => ArrayContainsInterfaceMethods", "ArrayContainsInterfaceMethods", cdPlayer1)
  231. );
  232. }
  233. @Test
  234. void getVolumeReturnValueBetween0And100(){
  235. CDPlayer cdPlayer1 = new CDPlayer();
  236. boolean volumeIstInValueRange=false;
  237. int volume=cdPlayer1.getVolume();
  238. if(volume>=0 && volume <=100){
  239. volumeIstInValueRange=true;
  240. }
  241. assertThat(volumeIstInValueRange).isEqualTo(true);
  242. }
  243. @ParameterizedTest
  244. @MethodSource("getInfoTestData")
  245. void getInfoTest(String testName, CDPlayer _cdPlayer,Exception exception , String expectedResult){
  246. Exception newException=assertThrows(exception.getClass(),()->_cdPlayer.getInfoText());
  247. assertEquals(ReturnValueNullException.class, newException.getClass());
  248. }
  249. static Stream<Arguments> getInfoTestData () {
  250. CDPlayer cdPlayer1 = new CDPlayer();
  251. return Stream.of(
  252. Arguments.of("[getInfoText() by infoText=null ] => shouldThrowReturnValueNullException", cdPlayer1,new ReturnValueNullException(),"")
  253. );
  254. }
  255. }