framework_gem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (872) hide show
  1. checksums.yaml +7 -0
  2. data/lib/EXECUTION_ENGINE.md +282 -0
  3. data/lib/Gemfile +12 -0
  4. data/lib/README.md +138 -0
  5. data/lib/User_Lib/helpers/helpers.rb +13 -0
  6. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_black_rois.rb +7 -0
  7. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_color_rois.rb +9 -0
  8. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_image_rois.rb +7 -0
  9. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_rois.rb +23 -0
  10. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_text_rois.rb +48 -0
  11. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_video_rois.rb +11 -0
  12. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_black_rois.rb +7 -0
  13. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_color_rois.rb +7 -0
  14. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_image_rois.rb +7 -0
  15. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_rois.rb +23 -0
  16. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_text_rois.rb +7 -0
  17. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_video_rois.rb +11 -0
  18. data/lib/User_Lib/rois/apple_tv/apple_tv_black_rois.rb +7 -0
  19. data/lib/User_Lib/rois/apple_tv/apple_tv_color_rois.rb +7 -0
  20. data/lib/User_Lib/rois/apple_tv/apple_tv_image_rois.rb +7 -0
  21. data/lib/User_Lib/rois/apple_tv/apple_tv_rois.rb +23 -0
  22. data/lib/User_Lib/rois/apple_tv/apple_tv_text_rois.rb +7 -0
  23. data/lib/User_Lib/rois/apple_tv/apple_tv_video_rois.rb +7 -0
  24. data/lib/User_Lib/rois/black_rois.rb +33 -0
  25. data/lib/User_Lib/rois/color_rois.rb +38 -0
  26. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_black_rois.rb +8 -0
  27. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_color_rois.rb +8 -0
  28. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_image_rois.rb +8 -0
  29. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_rois.rb +26 -0
  30. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_text_rois.rb +8 -0
  31. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_video_rois.rb +8 -0
  32. data/lib/User_Lib/rois/dta/dta_720/dta_720_black_rois.rb +8 -0
  33. data/lib/User_Lib/rois/dta/dta_720/dta_720_color_rois.rb +8 -0
  34. data/lib/User_Lib/rois/dta/dta_720/dta_720_image_rois.rb +8 -0
  35. data/lib/User_Lib/rois/dta/dta_720/dta_720_rois.rb +26 -0
  36. data/lib/User_Lib/rois/dta/dta_720/dta_720_text_rois.rb +8 -0
  37. data/lib/User_Lib/rois/dta/dta_720/dta_720_video_rois.rb +8 -0
  38. data/lib/User_Lib/rois/dta/dta_black_rois.rb +9 -0
  39. data/lib/User_Lib/rois/dta/dta_color_rois.rb +9 -0
  40. data/lib/User_Lib/rois/dta/dta_image_rois.rb +9 -0
  41. data/lib/User_Lib/rois/dta/dta_rois.rb +26 -0
  42. data/lib/User_Lib/rois/dta/dta_text_rois.rb +9 -0
  43. data/lib/User_Lib/rois/dta/dta_video_rois.rb +9 -0
  44. data/lib/User_Lib/rois/image_rois.rb +38 -0
  45. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_black_rois.rb +8 -0
  46. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_color_rois.rb +8 -0
  47. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_image_rois.rb +8 -0
  48. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_rois.rb +26 -0
  49. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_text_rois.rb +8 -0
  50. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_video_rois.rb +8 -0
  51. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_black_rois.rb +8 -0
  52. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_color_rois.rb +8 -0
  53. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_image_rois.rb +8 -0
  54. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_rois.rb +26 -0
  55. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_text_rois.rb +8 -0
  56. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_video_rois.rb +8 -0
  57. data/lib/User_Lib/rois/mdn/mdn_black_rois.rb +9 -0
  58. data/lib/User_Lib/rois/mdn/mdn_color_rois.rb +9 -0
  59. data/lib/User_Lib/rois/mdn/mdn_image_rois.rb +9 -0
  60. data/lib/User_Lib/rois/mdn/mdn_rois.rb +26 -0
  61. data/lib/User_Lib/rois/mdn/mdn_text_rois.rb +13 -0
  62. data/lib/User_Lib/rois/mdn/mdn_video_rois.rb +9 -0
  63. data/lib/User_Lib/rois/mobile/android/android_black_rois.rb +8 -0
  64. data/lib/User_Lib/rois/mobile/android/android_color_rois.rb +8 -0
  65. data/lib/User_Lib/rois/mobile/android/android_image_rois.rb +8 -0
  66. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_black_rois.rb +8 -0
  67. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_color_rois.rb +8 -0
  68. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_image_rois.rb +43 -0
  69. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_rois.rb +22 -0
  70. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_text_rois.rb +8 -0
  71. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_video_rois.rb +8 -0
  72. data/lib/User_Lib/rois/mobile/android/android_rois.rb +22 -0
  73. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_black_rois.rb +8 -0
  74. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_color_rois.rb +8 -0
  75. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_image_rois.rb +54 -0
  76. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_rois.rb +22 -0
  77. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_text_rois.rb +8 -0
  78. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_video_rois.rb +8 -0
  79. data/lib/User_Lib/rois/mobile/android/android_text_rois.rb +8 -0
  80. data/lib/User_Lib/rois/mobile/android/android_video_rois.rb +8 -0
  81. data/lib/User_Lib/rois/mobile/ios/ios_black_rois.rb +8 -0
  82. data/lib/User_Lib/rois/mobile/ios/ios_color_rois.rb +8 -0
  83. data/lib/User_Lib/rois/mobile/ios/ios_image_rois.rb +8 -0
  84. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_black_rois.rb +8 -0
  85. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_color_rois.rb +8 -0
  86. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_image_rois.rb +8 -0
  87. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_rois.rb +22 -0
  88. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_text_rois.rb +8 -0
  89. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_video_rois.rb +8 -0
  90. data/lib/User_Lib/rois/mobile/ios/ios_rois.rb +22 -0
  91. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_black_rois.rb +8 -0
  92. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_color_rois.rb +8 -0
  93. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_image_rois.rb +8 -0
  94. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_rois.rb +22 -0
  95. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_text_rois.rb +8 -0
  96. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_video_rois.rb +8 -0
  97. data/lib/User_Lib/rois/mobile/ios/ios_text_rois.rb +8 -0
  98. data/lib/User_Lib/rois/mobile/ios/ios_video_rois.rb +8 -0
  99. data/lib/User_Lib/rois/mobile/mobile_black_rois.rb +8 -0
  100. data/lib/User_Lib/rois/mobile/mobile_color_rois.rb +12 -0
  101. data/lib/User_Lib/rois/mobile/mobile_image_rois.rb +38 -0
  102. data/lib/User_Lib/rois/mobile/mobile_rois.rb +22 -0
  103. data/lib/User_Lib/rois/mobile/mobile_text_rois.rb +8 -0
  104. data/lib/User_Lib/rois/mobile/mobile_video_rois.rb +8 -0
  105. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_black_rois.rb +7 -0
  106. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_color_rois.rb +9 -0
  107. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_image_rois.rb +7 -0
  108. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_rois.rb +23 -0
  109. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_text_rois.rb +8 -0
  110. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_video_rois.rb +8 -0
  111. data/lib/User_Lib/rois/passport/passport_720/passport_720_black_rois.rb +7 -0
  112. data/lib/User_Lib/rois/passport/passport_720/passport_720_color_rois.rb +7 -0
  113. data/lib/User_Lib/rois/passport/passport_720/passport_720_image_rois.rb +7 -0
  114. data/lib/User_Lib/rois/passport/passport_720/passport_720_rois.rb +23 -0
  115. data/lib/User_Lib/rois/passport/passport_720/passport_720_text_rois.rb +7 -0
  116. data/lib/User_Lib/rois/passport/passport_720/passport_720_video_rois.rb +7 -0
  117. data/lib/User_Lib/rois/passport/passport_black_rois.rb +7 -0
  118. data/lib/User_Lib/rois/passport/passport_color_rois.rb +7 -0
  119. data/lib/User_Lib/rois/passport/passport_image_rois.rb +7 -0
  120. data/lib/User_Lib/rois/passport/passport_rois.rb +23 -0
  121. data/lib/User_Lib/rois/passport/passport_text_rois.rb +7 -0
  122. data/lib/User_Lib/rois/passport/passport_video_rois.rb +7 -0
  123. data/lib/User_Lib/rois/rois.rb +22 -0
  124. data/lib/User_Lib/rois/roku/roku_720/roku_720_black_rois.rb +37 -0
  125. data/lib/User_Lib/rois/roku/roku_720/roku_720_color_rois.rb +336 -0
  126. data/lib/User_Lib/rois/roku/roku_720/roku_720_image_rois.rb +235 -0
  127. data/lib/User_Lib/rois/roku/roku_720/roku_720_rois.rb +23 -0
  128. data/lib/User_Lib/rois/roku/roku_720/roku_720_text_rois.rb +1523 -0
  129. data/lib/User_Lib/rois/roku/roku_720/roku_720_video_rois.rb +32 -0
  130. data/lib/User_Lib/rois/roku/roku_black_rois.rb +14 -0
  131. data/lib/User_Lib/rois/roku/roku_color_rois.rb +9 -0
  132. data/lib/User_Lib/rois/roku/roku_image_rois.rb +13 -0
  133. data/lib/User_Lib/rois/roku/roku_rois.rb +23 -0
  134. data/lib/User_Lib/rois/roku/roku_text_rois.rb +9 -0
  135. data/lib/User_Lib/rois/roku/roku_video_rois.rb +9 -0
  136. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_black_rois.rb +12 -0
  137. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_color_rois.rb +11 -0
  138. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_image_rois.rb +12 -0
  139. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_rois.rb +23 -0
  140. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_text_rois.rb +12 -0
  141. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_video_rois.rb +12 -0
  142. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_black_rois.rb +12 -0
  143. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_color_rois.rb +12 -0
  144. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_image_rois.rb +12 -0
  145. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_rois.rb +23 -0
  146. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_text_rois.rb +12 -0
  147. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_video_rois.rb +12 -0
  148. data/lib/User_Lib/rois/roku_tv/roku_tv_black_rois.rb +12 -0
  149. data/lib/User_Lib/rois/roku_tv/roku_tv_color_rois.rb +12 -0
  150. data/lib/User_Lib/rois/roku_tv/roku_tv_image_rois.rb +12 -0
  151. data/lib/User_Lib/rois/roku_tv/roku_tv_rois.rb +23 -0
  152. data/lib/User_Lib/rois/roku_tv/roku_tv_text_rois.rb +12 -0
  153. data/lib/User_Lib/rois/roku_tv/roku_tv_video_rois.rb +12 -0
  154. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_black_rois.rb +13 -0
  155. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_color_rois.rb +29 -0
  156. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_image_rois.rb +9 -0
  157. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_rois.rb +23 -0
  158. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_text_rois.rb +92 -0
  159. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_video_rois.rb +11 -0
  160. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_black_rois.rb +9 -0
  161. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_color_rois.rb +9 -0
  162. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_image_rois.rb +9 -0
  163. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_rois.rb +23 -0
  164. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_text_rois.rb +12 -0
  165. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_video_rois.rb +11 -0
  166. data/lib/User_Lib/rois/samsung_tv/samsung_tv_black_rois.rb +9 -0
  167. data/lib/User_Lib/rois/samsung_tv/samsung_tv_color_rois.rb +9 -0
  168. data/lib/User_Lib/rois/samsung_tv/samsung_tv_image_rois.rb +9 -0
  169. data/lib/User_Lib/rois/samsung_tv/samsung_tv_rois.rb +23 -0
  170. data/lib/User_Lib/rois/samsung_tv/samsung_tv_text_rois.rb +12 -0
  171. data/lib/User_Lib/rois/samsung_tv/samsung_tv_video_rois.rb +9 -0
  172. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_black_rois.rb +8 -0
  173. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_color_rois.rb +8 -0
  174. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_image_rois.rb +8 -0
  175. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_rois.rb +26 -0
  176. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_text_rois.rb +8 -0
  177. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_video_rois.rb +8 -0
  178. data/lib/User_Lib/rois/sara/sara_720/sara_720_black_rois.rb +8 -0
  179. data/lib/User_Lib/rois/sara/sara_720/sara_720_color_rois.rb +8 -0
  180. data/lib/User_Lib/rois/sara/sara_720/sara_720_image_rois.rb +8 -0
  181. data/lib/User_Lib/rois/sara/sara_720/sara_720_rois.rb +26 -0
  182. data/lib/User_Lib/rois/sara/sara_720/sara_720_text_rois.rb +8 -0
  183. data/lib/User_Lib/rois/sara/sara_720/sara_720_video_rois.rb +8 -0
  184. data/lib/User_Lib/rois/sara/sara_black_rois.rb +9 -0
  185. data/lib/User_Lib/rois/sara/sara_color_rois.rb +9 -0
  186. data/lib/User_Lib/rois/sara/sara_image_rois.rb +9 -0
  187. data/lib/User_Lib/rois/sara/sara_rois.rb +26 -0
  188. data/lib/User_Lib/rois/sara/sara_text_rois.rb +9 -0
  189. data/lib/User_Lib/rois/sara/sara_video_rois.rb +9 -0
  190. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_black_rois.rb +9 -0
  191. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_color_rois.rb +17 -0
  192. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_image_rois.rb +19 -0
  193. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_rois.rb +23 -0
  194. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_text_rois.rb +47 -0
  195. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_video_rois.rb +23 -0
  196. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_black_rois.rb +9 -0
  197. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_color_rois.rb +9 -0
  198. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_image_rois.rb +9 -0
  199. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_rois.rb +23 -0
  200. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_text_rois.rb +17 -0
  201. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_video_rois.rb +11 -0
  202. data/lib/User_Lib/rois/stb/iguide/iguide_black_rois.rb +9 -0
  203. data/lib/User_Lib/rois/stb/iguide/iguide_color_rois.rb +9 -0
  204. data/lib/User_Lib/rois/stb/iguide/iguide_image_rois.rb +9 -0
  205. data/lib/User_Lib/rois/stb/iguide/iguide_rois.rb +23 -0
  206. data/lib/User_Lib/rois/stb/iguide/iguide_text_rois.rb +9 -0
  207. data/lib/User_Lib/rois/stb/iguide/iguide_video_rois.rb +9 -0
  208. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_black_rois.rb +8 -0
  209. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_color_rois.rb +8 -0
  210. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_image_rois.rb +12 -0
  211. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_rois.rb +23 -0
  212. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_text_rois.rb +23 -0
  213. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_video_rois.rb +11 -0
  214. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_black_rois.rb +46 -0
  215. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_color_rois.rb +142 -0
  216. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_image_rois.rb +103 -0
  217. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_black_rois.rb +6 -0
  218. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_color_rois.rb +6 -0
  219. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_image_rois.rb +6 -0
  220. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_rois.rb +23 -0
  221. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_text_rois.rb +7 -0
  222. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_video_rois.rb +7 -0
  223. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_rois.rb +23 -0
  224. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_black_rois.rb +6 -0
  225. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_color_rois.rb +6 -0
  226. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_image_rois.rb +6 -0
  227. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_rois.rb +23 -0
  228. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_text_rois.rb +7 -0
  229. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_video_rois.rb +7 -0
  230. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_black_rois.rb +6 -0
  231. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_color_rois.rb +77 -0
  232. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_image_rois.rb +67 -0
  233. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_rois.rb +23 -0
  234. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_text_rois.rb +159 -0
  235. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_video_rois.rb +17 -0
  236. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_text_rois.rb +221 -0
  237. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_video_rois.rb +26 -0
  238. data/lib/User_Lib/rois/stb/odn/odn_black_rois.rb +10 -0
  239. data/lib/User_Lib/rois/stb/odn/odn_color_rois.rb +10 -0
  240. data/lib/User_Lib/rois/stb/odn/odn_image_rois.rb +58 -0
  241. data/lib/User_Lib/rois/stb/odn/odn_rois.rb +23 -0
  242. data/lib/User_Lib/rois/stb/odn/odn_text_rois.rb +70 -0
  243. data/lib/User_Lib/rois/stb/odn/odn_video_rois.rb +19 -0
  244. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_black_rois.rb +16 -0
  245. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_color_rois.rb +373 -0
  246. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_black_rois.rb +7 -0
  247. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_color_rois.rb +7 -0
  248. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_image_rois.rb +7 -0
  249. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_rois.rb +23 -0
  250. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_text_rois.rb +7 -0
  251. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_video_rois.rb +7 -0
  252. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_black_rois.rb +8 -0
  253. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_color_rois.rb +8 -0
  254. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_image_rois.rb +8 -0
  255. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_rois.rb +26 -0
  256. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_text_rois.rb +8 -0
  257. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_video_rois.rb +8 -0
  258. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_black_rois.rb +8 -0
  259. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_color_rois.rb +8 -0
  260. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_image_rois.rb +8 -0
  261. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_rois.rb +26 -0
  262. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_text_rois.rb +8 -0
  263. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_video_rois.rb +8 -0
  264. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_black_rois.rb +8 -0
  265. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_color_rois.rb +8 -0
  266. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_image_rois.rb +8 -0
  267. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_rois.rb +26 -0
  268. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_text_rois.rb +8 -0
  269. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_video_rois.rb +8 -0
  270. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_image_rois.rb +1592 -0
  271. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_black_rois.rb +7 -0
  272. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_color_rois.rb +7 -0
  273. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_image_rois.rb +7 -0
  274. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_rois.rb +23 -0
  275. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_text_rois.rb +7 -0
  276. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_video_rois.rb +7 -0
  277. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_rois.rb +23 -0
  278. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_text_rois.rb +2489 -0
  279. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_video_rois.rb +64 -0
  280. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_black_rois.rb +7 -0
  281. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_color_rois.rb +63 -0
  282. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_black_rois.rb +8 -0
  283. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_color_rois.rb +8 -0
  284. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_image_rois.rb +8 -0
  285. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_rois.rb +26 -0
  286. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_text_rois.rb +8 -0
  287. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_video_rois.rb +8 -0
  288. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_black_rois.rb +8 -0
  289. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_color_rois.rb +8 -0
  290. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_image_rois.rb +8 -0
  291. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_rois.rb +26 -0
  292. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_text_rois.rb +8 -0
  293. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_video_rois.rb +8 -0
  294. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_black_rois.rb +8 -0
  295. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_color_rois.rb +8 -0
  296. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_image_rois.rb +8 -0
  297. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_rois.rb +26 -0
  298. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_text_rois.rb +8 -0
  299. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_video_rois.rb +8 -0
  300. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_image_rois.rb +117 -0
  301. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_rois.rb +23 -0
  302. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_text_rois.rb +84 -0
  303. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_video_rois.rb +35 -0
  304. data/lib/User_Lib/rois/stb/spectrum/spectrum_black_rois.rb +9 -0
  305. data/lib/User_Lib/rois/stb/spectrum/spectrum_color_rois.rb +17 -0
  306. data/lib/User_Lib/rois/stb/spectrum/spectrum_image_rois.rb +49 -0
  307. data/lib/User_Lib/rois/stb/spectrum/spectrum_rois.rb +23 -0
  308. data/lib/User_Lib/rois/stb/spectrum/spectrum_text_rois.rb +51 -0
  309. data/lib/User_Lib/rois/stb/spectrum/spectrum_video_rois.rb +9 -0
  310. data/lib/User_Lib/rois/stb/stb_black_rois.rb +9 -0
  311. data/lib/User_Lib/rois/stb/stb_color_rois.rb +9 -0
  312. data/lib/User_Lib/rois/stb/stb_image_rois.rb +9 -0
  313. data/lib/User_Lib/rois/stb/stb_rois.rb +23 -0
  314. data/lib/User_Lib/rois/stb/stb_text_rois.rb +9 -0
  315. data/lib/User_Lib/rois/stb/stb_video_rois.rb +9 -0
  316. data/lib/User_Lib/rois/template.txt +23 -0
  317. data/lib/User_Lib/rois/text_rois.rb +36 -0
  318. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_black_rois.rb +7 -0
  319. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_color_rois.rb +9 -0
  320. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_image_rois.rb +7 -0
  321. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_rois.rb +23 -0
  322. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_text_rois.rb +9 -0
  323. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_video_rois.rb +7 -0
  324. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_black_rois.rb +7 -0
  325. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_color_rois.rb +7 -0
  326. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_image_rois.rb +7 -0
  327. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_rois.rb +23 -0
  328. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_text_rois.rb +7 -0
  329. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_video_rois.rb +7 -0
  330. data/lib/User_Lib/rois/tivo/tivo_black_rois.rb +7 -0
  331. data/lib/User_Lib/rois/tivo/tivo_color_rois.rb +7 -0
  332. data/lib/User_Lib/rois/tivo/tivo_image_rois.rb +7 -0
  333. data/lib/User_Lib/rois/tivo/tivo_rois.rb +23 -0
  334. data/lib/User_Lib/rois/tivo/tivo_text_rois.rb +7 -0
  335. data/lib/User_Lib/rois/tivo/tivo_video_rois.rb +7 -0
  336. data/lib/User_Lib/rois/video_rois.rb +33 -0
  337. data/lib/User_Lib/screen/apple_tv/apple_tv_dvr.rb +25 -0
  338. data/lib/User_Lib/screen/apple_tv/apple_tv_guide.rb +25 -0
  339. data/lib/User_Lib/screen/apple_tv/apple_tv_library.rb +25 -0
  340. data/lib/User_Lib/screen/apple_tv/apple_tv_live_tv.rb +17 -0
  341. data/lib/User_Lib/screen/apple_tv/apple_tv_login.rb +24 -0
  342. data/lib/User_Lib/screen/apple_tv/apple_tv_main_menu.rb +25 -0
  343. data/lib/User_Lib/screen/apple_tv/apple_tv_mini_guide.rb +25 -0
  344. data/lib/User_Lib/screen/apple_tv/apple_tv_movies.rb +25 -0
  345. data/lib/User_Lib/screen/apple_tv/apple_tv_on_demand.rb +25 -0
  346. data/lib/User_Lib/screen/apple_tv/apple_tv_parental_controls.rb +25 -0
  347. data/lib/User_Lib/screen/apple_tv/apple_tv_product_page.rb +25 -0
  348. data/lib/User_Lib/screen/apple_tv/apple_tv_screen.rb +23 -0
  349. data/lib/User_Lib/screen/apple_tv/apple_tv_search.rb +31 -0
  350. data/lib/User_Lib/screen/apple_tv/apple_tv_settings.rb +25 -0
  351. data/lib/User_Lib/screen/apple_tv/apple_tv_tv_shows.rb +25 -0
  352. data/lib/User_Lib/screen/apple_tv/apple_tv_video_store.rb +25 -0
  353. data/lib/User_Lib/screen/dta/dta_dvr.rb +26 -0
  354. data/lib/User_Lib/screen/dta/dta_guide.rb +26 -0
  355. data/lib/User_Lib/screen/dta/dta_library.rb +26 -0
  356. data/lib/User_Lib/screen/dta/dta_live_tv.rb +26 -0
  357. data/lib/User_Lib/screen/dta/dta_log_in.rb +26 -0
  358. data/lib/User_Lib/screen/dta/dta_main_menu.rb +26 -0
  359. data/lib/User_Lib/screen/dta/dta_mini_guide.rb +26 -0
  360. data/lib/User_Lib/screen/dta/dta_movies.rb +26 -0
  361. data/lib/User_Lib/screen/dta/dta_on_demand.rb +26 -0
  362. data/lib/User_Lib/screen/dta/dta_parental_controls.rb +26 -0
  363. data/lib/User_Lib/screen/dta/dta_product_page.rb +26 -0
  364. data/lib/User_Lib/screen/dta/dta_screen.rb +24 -0
  365. data/lib/User_Lib/screen/dta/dta_search.rb +26 -0
  366. data/lib/User_Lib/screen/dta/dta_settings.rb +26 -0
  367. data/lib/User_Lib/screen/dta/dta_tv_shows.rb +26 -0
  368. data/lib/User_Lib/screen/dta/dta_video_store.rb +26 -0
  369. data/lib/User_Lib/screen/mdn/mdn_dvr.rb +26 -0
  370. data/lib/User_Lib/screen/mdn/mdn_guide.rb +26 -0
  371. data/lib/User_Lib/screen/mdn/mdn_library.rb +26 -0
  372. data/lib/User_Lib/screen/mdn/mdn_live_tv.rb +26 -0
  373. data/lib/User_Lib/screen/mdn/mdn_log_in.rb +26 -0
  374. data/lib/User_Lib/screen/mdn/mdn_main_menu.rb +26 -0
  375. data/lib/User_Lib/screen/mdn/mdn_mini_guide.rb +26 -0
  376. data/lib/User_Lib/screen/mdn/mdn_movies.rb +26 -0
  377. data/lib/User_Lib/screen/mdn/mdn_on_demand.rb +26 -0
  378. data/lib/User_Lib/screen/mdn/mdn_parental_controls.rb +26 -0
  379. data/lib/User_Lib/screen/mdn/mdn_product_page.rb +26 -0
  380. data/lib/User_Lib/screen/mdn/mdn_screen.rb +24 -0
  381. data/lib/User_Lib/screen/mdn/mdn_search.rb +26 -0
  382. data/lib/User_Lib/screen/mdn/mdn_settings.rb +26 -0
  383. data/lib/User_Lib/screen/mdn/mdn_tv_shows.rb +26 -0
  384. data/lib/User_Lib/screen/mdn/mdn_video_store.rb +26 -0
  385. data/lib/User_Lib/screen/mobile/android/android_devices.rb +35 -0
  386. data/lib/User_Lib/screen/mobile/android/android_dvr.rb +337 -0
  387. data/lib/User_Lib/screen/mobile/android/android_favorites.rb +164 -0
  388. data/lib/User_Lib/screen/mobile/android/android_guide.rb +256 -0
  389. data/lib/User_Lib/screen/mobile/android/android_live_tv.rb +372 -0
  390. data/lib/User_Lib/screen/mobile/android/android_login.rb +111 -0
  391. data/lib/User_Lib/screen/mobile/android/android_main_menu.rb +53 -0
  392. data/lib/User_Lib/screen/mobile/android/android_on_demand.rb +402 -0
  393. data/lib/User_Lib/screen/mobile/android/android_parental_controls.rb +73 -0
  394. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_dvr.rb +31 -0
  395. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_guide.rb +39 -0
  396. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_live_tv.rb +104 -0
  397. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_main_menu.rb +27 -0
  398. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_on_demand.rb +35 -0
  399. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_product_page.rb +7 -0
  400. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_search.rb +26 -0
  401. data/lib/User_Lib/screen/mobile/android/android_privacy_legal.rb +54 -0
  402. data/lib/User_Lib/screen/mobile/android/android_product_page.rb +484 -0
  403. data/lib/User_Lib/screen/mobile/android/android_screen.rb +56 -0
  404. data/lib/User_Lib/screen/mobile/android/android_search.rb +39 -0
  405. data/lib/User_Lib/screen/mobile/android/android_settings.rb +90 -0
  406. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_dvr.rb +58 -0
  407. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_guide.rb +24 -0
  408. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_live_tv.rb +24 -0
  409. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_main_menu.rb +19 -0
  410. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_on_demand.rb +16 -0
  411. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_product_page.rb +45 -0
  412. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_search.rb +14 -0
  413. data/lib/User_Lib/screen/mobile/devices_mobile.rb +53 -0
  414. data/lib/User_Lib/screen/mobile/dvr_mobile.rb +5 -0
  415. data/lib/User_Lib/screen/mobile/favorites_mobile.rb +5 -0
  416. data/lib/User_Lib/screen/mobile/guide_mobile.rb +5 -0
  417. data/lib/User_Lib/screen/mobile/ios/ios_devices.rb +43 -0
  418. data/lib/User_Lib/screen/mobile/ios/ios_dvr.rb +231 -0
  419. data/lib/User_Lib/screen/mobile/ios/ios_favorites.rb +79 -0
  420. data/lib/User_Lib/screen/mobile/ios/ios_guide.rb +53 -0
  421. data/lib/User_Lib/screen/mobile/ios/ios_live_tv.rb +413 -0
  422. data/lib/User_Lib/screen/mobile/ios/ios_login.rb +76 -0
  423. data/lib/User_Lib/screen/mobile/ios/ios_main_menu.rb +38 -0
  424. data/lib/User_Lib/screen/mobile/ios/ios_on_demand.rb +371 -0
  425. data/lib/User_Lib/screen/mobile/ios/ios_parental_controls.rb +104 -0
  426. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_dvr.rb +14 -0
  427. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_live_tv.rb +36 -0
  428. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_main_menu.rb +7 -0
  429. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_on_demand.rb +7 -0
  430. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_search.rb +13 -0
  431. data/lib/User_Lib/screen/mobile/ios/ios_privacy_legal.rb +56 -0
  432. data/lib/User_Lib/screen/mobile/ios/ios_product_page.rb +441 -0
  433. data/lib/User_Lib/screen/mobile/ios/ios_screen.rb +60 -0
  434. data/lib/User_Lib/screen/mobile/ios/ios_search.rb +145 -0
  435. data/lib/User_Lib/screen/mobile/ios/ios_settings.rb +34 -0
  436. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_live_tv.rb +34 -0
  437. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_main_menu.rb +7 -0
  438. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_on_demand.rb +7 -0
  439. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_search.rb +13 -0
  440. data/lib/User_Lib/screen/mobile/live_tv_mobile.rb +73 -0
  441. data/lib/User_Lib/screen/mobile/login_mobile.rb +5 -0
  442. data/lib/User_Lib/screen/mobile/main_menu_mobile.rb +83 -0
  443. data/lib/User_Lib/screen/mobile/mobile_screen.rb +232 -0
  444. data/lib/User_Lib/screen/mobile/on_demand_mobile.rb +70 -0
  445. data/lib/User_Lib/screen/mobile/parental_controls_mobile.rb +5 -0
  446. data/lib/User_Lib/screen/mobile/privacy_legal_mobile.rb +5 -0
  447. data/lib/User_Lib/screen/mobile/product_page_mobile.rb +5 -0
  448. data/lib/User_Lib/screen/mobile/search_mobile.rb +5 -0
  449. data/lib/User_Lib/screen/mobile/settings_mobile.rb +33 -0
  450. data/lib/User_Lib/screen/passport/passport_dvr.rb +25 -0
  451. data/lib/User_Lib/screen/passport/passport_guide.rb +37 -0
  452. data/lib/User_Lib/screen/passport/passport_library.rb +25 -0
  453. data/lib/User_Lib/screen/passport/passport_live_tv.rb +17 -0
  454. data/lib/User_Lib/screen/passport/passport_main_menu.rb +25 -0
  455. data/lib/User_Lib/screen/passport/passport_mini_guide.rb +25 -0
  456. data/lib/User_Lib/screen/passport/passport_movies.rb +25 -0
  457. data/lib/User_Lib/screen/passport/passport_on_demand.rb +25 -0
  458. data/lib/User_Lib/screen/passport/passport_parental_controls.rb +25 -0
  459. data/lib/User_Lib/screen/passport/passport_product_page.rb +25 -0
  460. data/lib/User_Lib/screen/passport/passport_screen.rb +23 -0
  461. data/lib/User_Lib/screen/passport/passport_search.rb +25 -0
  462. data/lib/User_Lib/screen/passport/passport_settings.rb +25 -0
  463. data/lib/User_Lib/screen/passport/passport_tv_shows.rb +25 -0
  464. data/lib/User_Lib/screen/passport/passport_video_store.rb +25 -0
  465. data/lib/User_Lib/screen/roku/brs/roku_guide_brs.rb +12 -0
  466. data/lib/User_Lib/screen/roku/brs/roku_home_brs.rb +12 -0
  467. data/lib/User_Lib/screen/roku/brs/roku_live_tv_brs.rb +12 -0
  468. data/lib/User_Lib/screen/roku/brs/roku_login_brs.rb +103 -0
  469. data/lib/User_Lib/screen/roku/brs/roku_main_menu_brs.rb +46 -0
  470. data/lib/User_Lib/screen/roku/brs/roku_on_demand_brs.rb +12 -0
  471. data/lib/User_Lib/screen/roku/brs/roku_product_page_brs.rb +12 -0
  472. data/lib/User_Lib/screen/roku/brs/roku_screen_brs.rb +9 -0
  473. data/lib/User_Lib/screen/roku/brs/roku_search_brs.rb +12 -0
  474. data/lib/User_Lib/screen/roku/brs/roku_settings_brs.rb +42 -0
  475. data/lib/User_Lib/screen/roku/brs/roku_watch_later_brs.rb +12 -0
  476. data/lib/User_Lib/screen/roku/brs/roku_welcome_brs.rb +12 -0
  477. data/lib/User_Lib/screen/roku/roku_dvr.rb +7 -0
  478. data/lib/User_Lib/screen/roku/roku_guide.rb +590 -0
  479. data/lib/User_Lib/screen/roku/roku_home.rb +346 -0
  480. data/lib/User_Lib/screen/roku/roku_library.rb +26 -0
  481. data/lib/User_Lib/screen/roku/roku_live_tv.rb +210 -0
  482. data/lib/User_Lib/screen/roku/roku_login.rb +795 -0
  483. data/lib/User_Lib/screen/roku/roku_main_menu.rb +425 -0
  484. data/lib/User_Lib/screen/roku/roku_mini_guide.rb +7 -0
  485. data/lib/User_Lib/screen/roku/roku_on_demand.rb +479 -0
  486. data/lib/User_Lib/screen/roku/roku_product_page.rb +483 -0
  487. data/lib/User_Lib/screen/roku/roku_screen.rb +85 -0
  488. data/lib/User_Lib/screen/roku/roku_search.rb +229 -0
  489. data/lib/User_Lib/screen/roku/roku_settings.rb +304 -0
  490. data/lib/User_Lib/screen/roku/roku_watch_later.rb +51 -0
  491. data/lib/User_Lib/screen/roku/roku_welcome.rb +10 -0
  492. data/lib/User_Lib/screen/roku_tv/roku_tv_dvr.rb +14 -0
  493. data/lib/User_Lib/screen/roku_tv/roku_tv_guide.rb +14 -0
  494. data/lib/User_Lib/screen/roku_tv/roku_tv_home.rb +14 -0
  495. data/lib/User_Lib/screen/roku_tv/roku_tv_library.rb +14 -0
  496. data/lib/User_Lib/screen/roku_tv/roku_tv_live_tv.rb +14 -0
  497. data/lib/User_Lib/screen/roku_tv/roku_tv_login.rb +14 -0
  498. data/lib/User_Lib/screen/roku_tv/roku_tv_main_menu.rb +14 -0
  499. data/lib/User_Lib/screen/roku_tv/roku_tv_mini_guide.rb +14 -0
  500. data/lib/User_Lib/screen/roku_tv/roku_tv_on_demand.rb +26 -0
  501. data/lib/User_Lib/screen/roku_tv/roku_tv_product_page.rb +14 -0
  502. data/lib/User_Lib/screen/roku_tv/roku_tv_screen.rb +7 -0
  503. data/lib/User_Lib/screen/roku_tv/roku_tv_search.rb +14 -0
  504. data/lib/User_Lib/screen/roku_tv/roku_tv_settings.rb +14 -0
  505. data/lib/User_Lib/screen/roku_tv/roku_tv_watch_later.rb +14 -0
  506. data/lib/User_Lib/screen/roku_tv/roku_tv_welcome.rb +14 -0
  507. data/lib/User_Lib/screen/samsung_tv/samsung_tv_dvr.rb +24 -0
  508. data/lib/User_Lib/screen/samsung_tv/samsung_tv_guide.rb +24 -0
  509. data/lib/User_Lib/screen/samsung_tv/samsung_tv_library.rb +24 -0
  510. data/lib/User_Lib/screen/samsung_tv/samsung_tv_live_tv.rb +21 -0
  511. data/lib/User_Lib/screen/samsung_tv/samsung_tv_login.rb +13 -0
  512. data/lib/User_Lib/screen/samsung_tv/samsung_tv_main_menu.rb +64 -0
  513. data/lib/User_Lib/screen/samsung_tv/samsung_tv_mini_guide.rb +24 -0
  514. data/lib/User_Lib/screen/samsung_tv/samsung_tv_movies.rb +140 -0
  515. data/lib/User_Lib/screen/samsung_tv/samsung_tv_on_demand.rb +76 -0
  516. data/lib/User_Lib/screen/samsung_tv/samsung_tv_parental_controls.rb +24 -0
  517. data/lib/User_Lib/screen/samsung_tv/samsung_tv_product_page.rb +24 -0
  518. data/lib/User_Lib/screen/samsung_tv/samsung_tv_screen.rb +74 -0
  519. data/lib/User_Lib/screen/samsung_tv/samsung_tv_search.rb +29 -0
  520. data/lib/User_Lib/screen/samsung_tv/samsung_tv_settings.rb +189 -0
  521. data/lib/User_Lib/screen/samsung_tv/samsung_tv_tv_shows.rb +24 -0
  522. data/lib/User_Lib/screen/samsung_tv/samsung_tv_video_store.rb +24 -0
  523. data/lib/User_Lib/screen/sara/sara_dvr.rb +26 -0
  524. data/lib/User_Lib/screen/sara/sara_guide.rb +43 -0
  525. data/lib/User_Lib/screen/sara/sara_library.rb +26 -0
  526. data/lib/User_Lib/screen/sara/sara_live_tv.rb +26 -0
  527. data/lib/User_Lib/screen/sara/sara_log_in.rb +26 -0
  528. data/lib/User_Lib/screen/sara/sara_main_menu.rb +26 -0
  529. data/lib/User_Lib/screen/sara/sara_mini_guide.rb +26 -0
  530. data/lib/User_Lib/screen/sara/sara_movies.rb +26 -0
  531. data/lib/User_Lib/screen/sara/sara_on_demand.rb +26 -0
  532. data/lib/User_Lib/screen/sara/sara_parental_controls.rb +26 -0
  533. data/lib/User_Lib/screen/sara/sara_product_page.rb +26 -0
  534. data/lib/User_Lib/screen/sara/sara_screen.rb +24 -0
  535. data/lib/User_Lib/screen/sara/sara_search.rb +26 -0
  536. data/lib/User_Lib/screen/sara/sara_settings.rb +26 -0
  537. data/lib/User_Lib/screen/sara/sara_tv_shows.rb +26 -0
  538. data/lib/User_Lib/screen/sara/sara_video_store.rb +26 -0
  539. data/lib/User_Lib/screen/stb/iguide/iguide_devices.rb +10 -0
  540. data/lib/User_Lib/screen/stb/iguide/iguide_dvr.rb +10 -0
  541. data/lib/User_Lib/screen/stb/iguide/iguide_favorites.rb +10 -0
  542. data/lib/User_Lib/screen/stb/iguide/iguide_guide.rb +39 -0
  543. data/lib/User_Lib/screen/stb/iguide/iguide_home.rb +10 -0
  544. data/lib/User_Lib/screen/stb/iguide/iguide_library.rb +10 -0
  545. data/lib/User_Lib/screen/stb/iguide/iguide_live_tv.rb +59 -0
  546. data/lib/User_Lib/screen/stb/iguide/iguide_login.rb +10 -0
  547. data/lib/User_Lib/screen/stb/iguide/iguide_main_menu.rb +10 -0
  548. data/lib/User_Lib/screen/stb/iguide/iguide_mini_guide.rb +10 -0
  549. data/lib/User_Lib/screen/stb/iguide/iguide_movies.rb +10 -0
  550. data/lib/User_Lib/screen/stb/iguide/iguide_on_demand.rb +531 -0
  551. data/lib/User_Lib/screen/stb/iguide/iguide_parental_controls.rb +10 -0
  552. data/lib/User_Lib/screen/stb/iguide/iguide_privacy_legal.rb +10 -0
  553. data/lib/User_Lib/screen/stb/iguide/iguide_product_page.rb +10 -0
  554. data/lib/User_Lib/screen/stb/iguide/iguide_quick_menu.rb +7 -0
  555. data/lib/User_Lib/screen/stb/iguide/iguide_screen.rb +21 -0
  556. data/lib/User_Lib/screen/stb/iguide/iguide_search.rb +10 -0
  557. data/lib/User_Lib/screen/stb/iguide/iguide_settings.rb +10 -0
  558. data/lib/User_Lib/screen/stb/iguide/iguide_tv_shows.rb +10 -0
  559. data/lib/User_Lib/screen/stb/iguide/iguide_video_store.rb +10 -0
  560. data/lib/User_Lib/screen/stb/login_stb.rb +5 -0
  561. data/lib/User_Lib/screen/stb/odn/odn_dvr.rb +59 -0
  562. data/lib/User_Lib/screen/stb/odn/odn_favorites.rb +8 -0
  563. data/lib/User_Lib/screen/stb/odn/odn_guide.rb +177 -0
  564. data/lib/User_Lib/screen/stb/odn/odn_live_tv.rb +115 -0
  565. data/lib/User_Lib/screen/stb/odn/odn_login.rb +8 -0
  566. data/lib/User_Lib/screen/stb/odn/odn_main_menu.rb +175 -0
  567. data/lib/User_Lib/screen/stb/odn/odn_on_demand.rb +1170 -0
  568. data/lib/User_Lib/screen/stb/odn/odn_on_demand_kids.rb +23 -0
  569. data/lib/User_Lib/screen/stb/odn/odn_on_demand_left_menu.rb +180 -0
  570. data/lib/User_Lib/screen/stb/odn/odn_parental_controls.rb +9 -0
  571. data/lib/User_Lib/screen/stb/odn/odn_product_page.rb +8 -0
  572. data/lib/User_Lib/screen/stb/odn/odn_screen.rb +111 -0
  573. data/lib/User_Lib/screen/stb/odn/odn_search.rb +167 -0
  574. data/lib/User_Lib/screen/stb/odn/odn_settings.rb +142 -0
  575. data/lib/User_Lib/screen/stb/spectrum/spectrum_diagnostics.rb +27 -0
  576. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/screen_spectrum_docsis.rb +12 -0
  577. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_guide.rb +10 -0
  578. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_main_menu.rb +10 -0
  579. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_settings.rb +10 -0
  580. data/lib/User_Lib/screen/stb/spectrum/spectrum_dvr.rb +1781 -0
  581. data/lib/User_Lib/screen/stb/spectrum/spectrum_guide.rb +841 -0
  582. data/lib/User_Lib/screen/stb/spectrum/spectrum_library.rb +384 -0
  583. data/lib/User_Lib/screen/stb/spectrum/spectrum_live_tv.rb +259 -0
  584. data/lib/User_Lib/screen/stb/spectrum/spectrum_main_menu.rb +223 -0
  585. data/lib/User_Lib/screen/stb/spectrum/spectrum_mini_guide.rb +404 -0
  586. data/lib/User_Lib/screen/stb/spectrum/spectrum_movies.rb +420 -0
  587. data/lib/User_Lib/screen/stb/spectrum/spectrum_netflix.rb +37 -0
  588. data/lib/User_Lib/screen/stb/spectrum/spectrum_on_demand.rb +2137 -0
  589. data/lib/User_Lib/screen/stb/spectrum/spectrum_parental_controls.rb +528 -0
  590. data/lib/User_Lib/screen/stb/spectrum/spectrum_pay_per_view.rb +26 -0
  591. data/lib/User_Lib/screen/stb/spectrum/spectrum_product_page.rb +58 -0
  592. data/lib/User_Lib/screen/stb/spectrum/spectrum_screen.rb +48 -0
  593. data/lib/User_Lib/screen/stb/spectrum/spectrum_search.rb +92 -0
  594. data/lib/User_Lib/screen/stb/spectrum/spectrum_settings.rb +1657 -0
  595. data/lib/User_Lib/screen/stb/spectrum/spectrum_tv_shows.rb +1532 -0
  596. data/lib/User_Lib/screen/stb/spectrum/spectrum_video_store.rb +1598 -0
  597. data/lib/User_Lib/screen/stb/stb_screen.rb +7 -0
  598. data/lib/User_Lib/screen/tivo/tivo_dvr.rb +25 -0
  599. data/lib/User_Lib/screen/tivo/tivo_guide.rb +25 -0
  600. data/lib/User_Lib/screen/tivo/tivo_library.rb +25 -0
  601. data/lib/User_Lib/screen/tivo/tivo_live_tv.rb +17 -0
  602. data/lib/User_Lib/screen/tivo/tivo_login.rb +25 -0
  603. data/lib/User_Lib/screen/tivo/tivo_main_menu.rb +25 -0
  604. data/lib/User_Lib/screen/tivo/tivo_mini_guide.rb +25 -0
  605. data/lib/User_Lib/screen/tivo/tivo_movies.rb +25 -0
  606. data/lib/User_Lib/screen/tivo/tivo_on_demand.rb +25 -0
  607. data/lib/User_Lib/screen/tivo/tivo_parental_controls.rb +25 -0
  608. data/lib/User_Lib/screen/tivo/tivo_product_page.rb +25 -0
  609. data/lib/User_Lib/screen/tivo/tivo_screen.rb +20 -0
  610. data/lib/User_Lib/screen/tivo/tivo_search.rb +31 -0
  611. data/lib/User_Lib/screen/tivo/tivo_settings.rb +25 -0
  612. data/lib/User_Lib/screen/tivo/tivo_tv_shows.rb +25 -0
  613. data/lib/User_Lib/screen/tivo/tivo_video_store.rb +25 -0
  614. data/lib/config/ConfigParams.xml +96 -0
  615. data/lib/config/ImageROI.xml +45 -0
  616. data/lib/config/ROI.xml +150 -0
  617. data/lib/config/Userlog4j.xml +62 -0
  618. data/lib/config/schema-docs/mode.xsd +12 -0
  619. data/lib/config/schema-docs/processTestJobs.xsd +63 -0
  620. data/lib/config/schema-docs/rackip.xsd +24 -0
  621. data/lib/copy_ref_images.rb +199 -0
  622. data/lib/copy_repo.rb +136 -0
  623. data/lib/diagnostics/conductor/conductor_checkup.tmc +24 -0
  624. data/lib/diagnostics/db/mad_db_check.tmc +56 -0
  625. data/lib/diagnostics/db/mas_db_checkup.tmc +24 -0
  626. data/lib/diagnostics/db/mas_db_checkup_gem.tmc +20 -0
  627. data/lib/diagnostics/db/mas_db_checkup_jar.tmc +50 -0
  628. data/lib/diagnostics/iguide/iguide_nvram_reset.tmc +23 -0
  629. data/lib/diagnostics/iguide/iguide_prepare_stb.tmc +33 -0
  630. data/lib/diagnostics/iguide/iguide_prepare_stb_and_health_check.tmc +63 -0
  631. data/lib/diagnostics/iguide/iguide_stb_health_check.tmc +54 -0
  632. data/lib/diagnostics/prepare_stb.tmc +30 -0
  633. data/lib/diagnostics/prepare_stb_and_health_check.tmc +56 -0
  634. data/lib/diagnostics/script_options/options_checkup.tmc +145 -0
  635. data/lib/diagnostics/server_components_check.tmc +62 -0
  636. data/lib/diagnostics/ssh/dncs_checkup.tmc +24 -0
  637. data/lib/diagnostics/ssh/mas_checkup.tmc +24 -0
  638. data/lib/diagnostics/stb_health_check.tmc +46 -0
  639. data/lib/diagnostics/stb_ip_check.tmc +120 -0
  640. data/lib/diagnostics/webservices/mas_rest_services_checkup.tmc +24 -0
  641. data/lib/diagnostics/webservices/mas_soap_services_checkup.tmc +24 -0
  642. data/lib/dsllib/common/dncs/dncs_utils.rb +449 -0
  643. data/lib/dsllib/common/mas_db/mas_conductor.rb +1328 -0
  644. data/lib/dsllib/common/mas_db/mas_db.rb +154 -0
  645. data/lib/dsllib/common/mas_db/mas_publish.rb +2349 -0
  646. data/lib/dsllib/common/mas_db/mas_rest_services.rb +75 -0
  647. data/lib/dsllib/common/mas_db/mas_soap_services.rb +540 -0
  648. data/lib/dsllib/common/mas_db/mas_utils.rb +422 -0
  649. data/lib/dsllib/common/remote_diagnostics/mdn_remote_diagnostics.rb +1335 -0
  650. data/lib/dsllib/common/remote_diagnostics/odn_web_server.rb +269 -0
  651. data/lib/dsllib/common/utils/excel_export.rb +273 -0
  652. data/lib/dsllib/common/utils/excel_module.rb +890 -0
  653. data/lib/dsllib/common/utils/server_components_utils.rb +130 -0
  654. data/lib/dsllib/common/utils/stb_health_check_utils.rb +92 -0
  655. data/lib/dsllib/common/utils/sword_utils.rb +393 -0
  656. data/lib/dsllib/common/utils/tmc_utils.rb +2944 -0
  657. data/lib/dsllib/common/utils/virtual_keyboard_navigator.rb +208 -0
  658. data/lib/dsllib/common/utils/virtual_keyboard_vp_navigator.rb +195 -0
  659. data/lib/dsllib/performance/DTA/roi.rb +214 -0
  660. data/lib/dsllib/performance/DTA/utils.rb +96 -0
  661. data/lib/dsllib/performance/iguide_concurrent_test/ROI.rb +236 -0
  662. data/lib/dsllib/performance/iguide_concurrent_test/utils.rb +533 -0
  663. data/lib/dsllib/performance/measure_tune.rb +438 -0
  664. data/lib/dsllib/performance/perf_lib.rb +660 -0
  665. data/lib/end_iteration.rb +4 -0
  666. data/lib/lib/data_services/channel.rb +39 -0
  667. data/lib/lib/data_services/data_services.rb +14 -0
  668. data/lib/lib/data_services/guide.rb +104 -0
  669. data/lib/lib/data_services/lineup.rb +114 -0
  670. data/lib/lib/data_services/program.rb +48 -0
  671. data/lib/lib/data_services/schedule.rb +18 -0
  672. data/lib/lib/data_services/splunk_connector.rb +135 -0
  673. data/lib/lib/data_services/splunk_data_reader.rb +77 -0
  674. data/lib/lib/element/element.rb +79 -0
  675. data/lib/lib/extensions/array_extensions.rb +32 -0
  676. data/lib/lib/extensions/datetime_extensions.rb +8 -0
  677. data/lib/lib/extensions/extensions.rb +51 -0
  678. data/lib/lib/extensions/file_extensions.rb +32 -0
  679. data/lib/lib/extensions/float_extensions.rb +32 -0
  680. data/lib/lib/extensions/integer_extensions.rb +39 -0
  681. data/lib/lib/extensions/nethttp_extensions.rb +11 -0
  682. data/lib/lib/extensions/object_extensions.rb +7 -0
  683. data/lib/lib/extensions/string_extensions.rb +35 -0
  684. data/lib/lib/helpers/tmc_helpers/csv_helper/csv_helper.rb +85 -0
  685. data/lib/lib/helpers/tmc_helpers/email_helper/email_helper.rb +71 -0
  686. data/lib/lib/helpers/tmc_helpers/http_helper/http_helper.rb +133 -0
  687. data/lib/lib/helpers/tmc_helpers/roi_helper/roi_helper.rb +17 -0
  688. data/lib/lib/helpers/tmc_helpers/snmp_helper/snmp_helper.rb +71 -0
  689. data/lib/lib/helpers/tmc_helpers/ssh_helper/ssh_helper.rb +337 -0
  690. data/lib/lib/helpers/tmc_helpers/tmc_helpers.rb +1260 -0
  691. data/lib/lib/keyboard/apple_tv/apple_tv_password_keyboard.rb +102 -0
  692. data/lib/lib/keyboard/apple_tv/apple_tv_search_keyboard.rb +103 -0
  693. data/lib/lib/keyboard/apple_tv/apple_tv_username_keyboard.rb +105 -0
  694. data/lib/lib/keyboard/keyboard.rb +504 -0
  695. data/lib/lib/keyboard/keyboard_layout.rb +51 -0
  696. data/lib/lib/keyboard/roku/roku_reset_pin_keyboard.rb +12 -0
  697. data/lib/lib/keyboard/roku/roku_rsg_search_keyboard.rb +67 -0
  698. data/lib/lib/keyboard/roku/roku_rsg_signin_keyboard.rb +106 -0
  699. data/lib/lib/keyboard/roku/roku_search_keyboard.rb +10 -0
  700. data/lib/lib/keyboard/roku/roku_signin_keyboard.rb +42 -0
  701. data/lib/lib/keyboard/samsung_tv/samsung_tv_search_keyboard.rb +50 -0
  702. data/lib/lib/keyboard/samsung_tv/samsung_tv_signin_keyboard.rb +52 -0
  703. data/lib/lib/keyboard/stb/odn/odn_on_demand_search_keyboard.rb +10 -0
  704. data/lib/lib/keyboard/stb/odn/odn_search_keyboard.rb +10 -0
  705. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_email_keyboard.rb +50 -0
  706. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_keyboard.rb +43 -0
  707. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_name_keyboard.rb +16 -0
  708. data/lib/lib/keyboard/stb/spectrum/spectrum_search_keyboard.rb +32 -0
  709. data/lib/lib/keyboard/tivo/tivo_password_keyboard.rb +0 -0
  710. data/lib/lib/keyboard/tivo/tivo_search_keyboard.rb +0 -0
  711. data/lib/lib/keyboard/tivo/tivo_username_keyboard.rb +0 -0
  712. data/lib/lib/keys/apple_tv/apple_tv_keys.rb +26 -0
  713. data/lib/lib/keys/base_keys.rb +14 -0
  714. data/lib/lib/keys/dta/dta_keys.rb +60 -0
  715. data/lib/lib/keys/mdn/mdn_keys.rb +60 -0
  716. data/lib/lib/keys/passport/passport_keys.rb +59 -0
  717. data/lib/lib/keys/roku/roku_keys.rb +31 -0
  718. data/lib/lib/keys/roku_tv/roku_tv_keys.rb +32 -0
  719. data/lib/lib/keys/samsung_tv/samsung_tv_keys.rb +58 -0
  720. data/lib/lib/keys/sara/sara_keys.rb +60 -0
  721. data/lib/lib/keys/stb/iguide/iguide_keys.rb +56 -0
  722. data/lib/lib/keys/stb/odn/odn_keys.rb +63 -0
  723. data/lib/lib/keys/stb/spectrum/spectrum_keys.rb +59 -0
  724. data/lib/lib/keys/stb/stb_keys.rb +13 -0
  725. data/lib/lib/keys/tivo/tivo_keys.rb +26 -0
  726. data/lib/lib/logger/multi_io.rb +14 -0
  727. data/lib/lib/logger/tmc_dut_logger.rb +251 -0
  728. data/lib/lib/logger/tmc_logger.rb +30 -0
  729. data/lib/lib/mixins/assignable.rb +19 -0
  730. data/lib/lib/mixins/can_have_special_methods.rb +50 -0
  731. data/lib/lib/mixins/enumish.rb +16 -0
  732. data/lib/lib/new_platform.rb +302 -0
  733. data/lib/lib/new_sub_platform.rb +90 -0
  734. data/lib/lib/platform/apple_tv/apple_tv.rb +33 -0
  735. data/lib/lib/platform/apple_tv/apple_tv_1080/apple_tv_1080.rb +54 -0
  736. data/lib/lib/platform/apple_tv/apple_tv_720/apple_tv_720.rb +14 -0
  737. data/lib/lib/platform/dta/dta.rb +35 -0
  738. data/lib/lib/platform/dta/dta_1080/dta_1080.rb +15 -0
  739. data/lib/lib/platform/dta/dta_720/dta_720.rb +15 -0
  740. data/lib/lib/platform/mdn/mdn.rb +35 -0
  741. data/lib/lib/platform/mdn/mdn_1080/mdn_1080.rb +15 -0
  742. data/lib/lib/platform/mdn/mdn_720/mdn_720.rb +15 -0
  743. data/lib/lib/platform/mobile/android/android.rb +23 -0
  744. data/lib/lib/platform/mobile/android/android_phone/android_phone.rb +23 -0
  745. data/lib/lib/platform/mobile/android/android_tablet/android_tablet.rb +23 -0
  746. data/lib/lib/platform/mobile/ios/ios.rb +23 -0
  747. data/lib/lib/platform/mobile/ios/ios_phone/ios_phone.rb +23 -0
  748. data/lib/lib/platform/mobile/ios/ios_tablet/ios_tablet.rb +23 -0
  749. data/lib/lib/platform/mobile/mobile.rb +102 -0
  750. data/lib/lib/platform/passport/passport.rb +41 -0
  751. data/lib/lib/platform/passport/passport1080/passport_1080.rb +15 -0
  752. data/lib/lib/platform/passport/passport_720/passport_720.rb +14 -0
  753. data/lib/lib/platform/platform.rb +884 -0
  754. data/lib/lib/platform/roku/roku.rb +96 -0
  755. data/lib/lib/platform/roku/roku_720/roku_720.rb +16 -0
  756. data/lib/lib/platform/roku_tv/roku_tv.rb +33 -0
  757. data/lib/lib/platform/roku_tv/roku_tv_1080/roku_tv_1080.rb +14 -0
  758. data/lib/lib/platform/roku_tv/roku_tv_720/roku_tv_720.rb +14 -0
  759. data/lib/lib/platform/samsung_tv/samsung_tv.rb +31 -0
  760. data/lib/lib/platform/samsung_tv/samsung_tv_1080/samsung_tv_1080.rb +14 -0
  761. data/lib/lib/platform/samsung_tv/samsung_tv_720/samsung_tv_720.rb +14 -0
  762. data/lib/lib/platform/sara/sara.rb +42 -0
  763. data/lib/lib/platform/sara/sara_1080/sara_1080.rb +15 -0
  764. data/lib/lib/platform/sara/sara_720/sara_720.rb +15 -0
  765. data/lib/lib/platform/stb/iguide/iguide.rb +18 -0
  766. data/lib/lib/platform/stb/iguide/iguide_1080/iguide_1080.rb +14 -0
  767. data/lib/lib/platform/stb/iguide/iguide_720/iguide_720.rb +14 -0
  768. data/lib/lib/platform/stb/odn/odn.rb +480 -0
  769. data/lib/lib/platform/stb/odn/odn_1080/odn_1080.rb +14 -0
  770. data/lib/lib/platform/stb/odn/odn_720/odn_720.rb +14 -0
  771. data/lib/lib/platform/stb/odn/odn_720/odn_720_moto/odn_720_moto.rb +14 -0
  772. data/lib/lib/platform/stb/odn/odn_720/odn_720_sa/odn_720_sa.rb +14 -0
  773. data/lib/lib/platform/stb/odn/odn_720/odn_720_samsung/odn_720_samsung.rb +14 -0
  774. data/lib/lib/platform/stb/spectrum/spectrum.rb +48 -0
  775. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080.rb +14 -0
  776. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis.rb +16 -0
  777. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris.rb +15 -0
  778. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax.rb +15 -0
  779. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch.rb +15 -0
  780. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace.rb +14 -0
  781. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720.rb +14 -0
  782. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris.rb +15 -0
  783. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax.rb +15 -0
  784. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch.rb +15 -0
  785. data/lib/lib/platform/stb/stb.rb +93 -0
  786. data/lib/lib/platform/template.txt +16 -0
  787. data/lib/lib/platform/tivo/tivo.rb +28 -0
  788. data/lib/lib/platform/tivo/tivo_1080/tivo_1080.rb +15 -0
  789. data/lib/lib/platform/tivo/tivo_720/tivo_720.rb +14 -0
  790. data/lib/lib/platform/web/web.rb +51 -0
  791. data/lib/lib/platform_libs/roku/roku_controller.rb +254 -0
  792. data/lib/lib/prereqs/prereqs.rb +17 -0
  793. data/lib/lib/prereqs/prereqs_for_dut.rb +14 -0
  794. data/lib/lib/prereqs/prereqs_for_test.rb +14 -0
  795. data/lib/lib/remotes/remotes.rb +8 -0
  796. data/lib/lib/remotes/stb/spectrum/spectrum_remotes.rb +22 -0
  797. data/lib/lib/roi/black/black_roi.rb +125 -0
  798. data/lib/lib/roi/color/color_roi.rb +138 -0
  799. data/lib/lib/roi/image/image_roi.rb +187 -0
  800. data/lib/lib/roi/roi.rb +1064 -0
  801. data/lib/lib/roi/template_roi.txt +9 -0
  802. data/lib/lib/roi/text/text_roi.rb +187 -0
  803. data/lib/lib/roi/video/video_roi.rb +98 -0
  804. data/lib/lib/screen/screen.rb +183 -0
  805. data/lib/lib/screen/template.txt +7 -0
  806. data/lib/lib/screen/template_screen.txt +10 -0
  807. data/lib/lib/screens/apple_tv/apple_tv_screens.rb +44 -0
  808. data/lib/lib/screens/dta/dta_screens.rb +49 -0
  809. data/lib/lib/screens/mdn/mdn_screens.rb +49 -0
  810. data/lib/lib/screens/mobile/android/android_phone/android_phone_screens.rb +28 -0
  811. data/lib/lib/screens/mobile/android/android_screens.rb +40 -0
  812. data/lib/lib/screens/mobile/android/android_tablet/android_tablet_screens.rb +29 -0
  813. data/lib/lib/screens/mobile/ios/ios_phone/ios_phone_screens.rb +22 -0
  814. data/lib/lib/screens/mobile/ios/ios_screens.rb +39 -0
  815. data/lib/lib/screens/mobile/ios/ios_tablet/ios_tablet_screens.rb +20 -0
  816. data/lib/lib/screens/mobile/mobile_screens.rb +18 -0
  817. data/lib/lib/screens/passport/passport_screens.rb +42 -0
  818. data/lib/lib/screens/roku/roku_screens.rb +72 -0
  819. data/lib/lib/screens/roku_tv/roku_tv_screens.rb +43 -0
  820. data/lib/lib/screens/samsung_tv/samsung_tv_screens.rb +44 -0
  821. data/lib/lib/screens/sara/sara_screens.rb +49 -0
  822. data/lib/lib/screens/screens.rb +23 -0
  823. data/lib/lib/screens/stb/iguide/iguide_1080/iguide_1080_screens.rb +56 -0
  824. data/lib/lib/screens/stb/iguide/iguide_720/iguide_720_screens.rb +56 -0
  825. data/lib/lib/screens/stb/iguide/iguide_screens.rb +54 -0
  826. data/lib/lib/screens/stb/odn/odn_screens.rb +40 -0
  827. data/lib/lib/screens/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_screens.rb +18 -0
  828. data/lib/lib/screens/stb/spectrum/spectrum_screens.rb +48 -0
  829. data/lib/lib/screens/stb/stb_screens.rb +13 -0
  830. data/lib/lib/screens/template.txt +52 -0
  831. data/lib/lib/screens/tivo/tivo_screens.rb +44 -0
  832. data/lib/lib/selenium/appium/appium.rb +388 -0
  833. data/lib/lib/selenium/selenium.rb +466 -0
  834. data/lib/lib/selenium/webdriver/webdriver.rb +254 -0
  835. data/lib/lib/test_case/boilerplate/functional.rb +7 -0
  836. data/lib/lib/test_case/boilerplate/performance.rb +7 -0
  837. data/lib/lib/test_case/ci_test.rb +47 -0
  838. data/lib/lib/test_case/functional_test_case.rb +27 -0
  839. data/lib/lib/test_case/make_boilerplate.rb +32 -0
  840. data/lib/lib/test_case/monitoring/apple_monitor.rb +104 -0
  841. data/lib/lib/test_case/monitoring/base_monitor.rb +140 -0
  842. data/lib/lib/test_case/monitoring/dta_monitor.rb +53 -0
  843. data/lib/lib/test_case/monitoring/iguide_monitor.rb +72 -0
  844. data/lib/lib/test_case/monitoring/mdn_monitor.rb +28 -0
  845. data/lib/lib/test_case/monitoring/monitoring_test.rb +111 -0
  846. data/lib/lib/test_case/monitoring/odn_monitor.rb +137 -0
  847. data/lib/lib/test_case/monitoring/passport_monitor.rb +50 -0
  848. data/lib/lib/test_case/monitoring/report_monitor.rb +178 -0
  849. data/lib/lib/test_case/monitoring/roku_monitor.rb +102 -0
  850. data/lib/lib/test_case/monitoring/sara_monitor.rb +33 -0
  851. data/lib/lib/test_case/monitoring/spec_monitor.rb +154 -0
  852. data/lib/lib/test_case/performance_test_case.rb +29 -0
  853. data/lib/lib/test_case/test_case.rb +1055 -0
  854. data/lib/lib/test_case/test_error.rb +29 -0
  855. data/lib/lib/test_case/test_exception.rb +9 -0
  856. data/lib/lib/test_case/test_status.rb +39 -0
  857. data/lib/lib/test_case/test_step.rb +156 -0
  858. data/lib/lib/test_case/test_trace.rb +80 -0
  859. data/lib/lib/test_data.rb +222 -0
  860. data/lib/lib/test_wrapper.rb +146 -0
  861. data/lib/misc/get_latest_android.sh +14 -0
  862. data/lib/misc/get_latest_ios.sh +14 -0
  863. data/lib/package-lock.json +3 -0
  864. data/lib/run_test.rb +4 -0
  865. data/lib/script_validator.rb +48 -0
  866. data/lib/syntax_eval.rb +151 -0
  867. data/lib/tools/convert_old_scripts.rb +100 -0
  868. data/lib/tools/find_duplicate_rois.rb +27 -0
  869. data/lib/tools/roku/inspector.rb +130 -0
  870. data/lib/tools/syntax_checker.rb +83 -0
  871. data/lib/upload_ref_images.rb +255 -0
  872. metadata +912 -0
@@ -0,0 +1,138 @@
1
+ require './lib/roi/roi'
2
+ require './lib/mixins/can_have_special_methods'
3
+
4
+ # The ColorRoi class defines a color Roi and its methods
5
+
6
+ class ColorRoi < Roi
7
+ include CanHaveSpecialMethods
8
+
9
+ attr_accessor(:red, :green, :blue, :similarity)
10
+
11
+ # Public: Initializes a color Roi.
12
+ #
13
+ # dut - Platform (or subclass) instance to which this Roi belongs.
14
+ # x - Integer x coordinate (default: nil).
15
+ # y - Integer y coordinate (default: nil).
16
+ # width - Integer width (default: nil).
17
+ # height - Integer height (default: nil).
18
+ # rectangle - Hash defining rectangle with keys :x, :y, :width, :height (default: nil).
19
+ # element - Hash same as rectangle (default: nil).
20
+ # red - Integer red value 0 - 255 (default: nil). Required unless rgb is given.
21
+ # green - Integer green value 0 - 255 (default: nil). Required unless rgb is given.
22
+ # blue - Integer blue value 0 - 255 (default: nil). Required unless rgb is given.
23
+ # rgb - Integer Array of 3 values (0 - 255) for red, green, blue (default: nil).
24
+ # Required unless red, green, blue are given.
25
+ # similarity - Integer color similarity threshold 0 - 100 (default: 85).
26
+ # ref_img - String path to reference image (default: nil).
27
+ #
28
+ # Returns nothing.
29
+ def initialize(dut, args={})
30
+ super(dut, args)
31
+ if args[:rgb].nil?
32
+ self.rgb=([args.fetch(:red), args.fetch(:green), args.fetch(:blue)])
33
+ else
34
+ self.rgb=(args[:rgb])
35
+ end
36
+ @similarity = args.fetch(:similarity, 85)
37
+ end
38
+
39
+ # Public: Gets RGB value.
40
+ #
41
+ # Returns Integer Array of 3 values (0 - 255) for red, green, blue.
42
+ def rgb
43
+ [@red, @green, @blue]
44
+ end
45
+
46
+ # Public: Sets RGB value.
47
+ #
48
+ # rgb - Integer Array of 3 values (0 - 255) for red, green, blue.
49
+ #
50
+ # Returns nothing.
51
+ def rgb=(rgb)
52
+ @red = rgb[0]
53
+ @green = rgb[1]
54
+ @blue = rgb[2]
55
+ end
56
+
57
+ # Public: Gets color Roi info.
58
+ #
59
+ # Returns a tidy String with color Roi info.
60
+ def info
61
+ "#{super} RGB=#{@red}:#{@green}:#{@blue} Similarity=#{@similarity}"
62
+ end
63
+
64
+ # Public: Checks if color is displayed as defined in the given ROI.
65
+ # Corresponds to: api_is_color_displayed?
66
+ #
67
+ # key - String name of key to press to trigger evaluation (default: nil).
68
+ # If default, no keys will be pressed.
69
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
70
+ # timeout - Integer total milliseconds to allow before timing out (default: 0).
71
+ # verifies_for - Integer total milliseconds for which the ROI must verify in order to succeed (default: 0).
72
+ # If default, the ROI must only verify once.
73
+ # priority - Symbol representing evaluation priority used to throttle CPU usage (default: :normal):
74
+ # :critical - Sleep 10 milliseconds between intensive tasks (should be used sparingly).
75
+ # :high - Sleep 100 milliseconds between intensive tasks.
76
+ # :normal - Sleep 1 second between intensive tasks (default).
77
+ # :low - Sleep 10 seconds between intensive tasks.
78
+ # :background - Sleep 1 minute between intensive tasks (should be used sparingly).
79
+ # log_every - Integer interval in milliseconds between logs (default: 1000).
80
+ #
81
+ # Returns a Boolean true if color is displayed before the timeout, otherwise false.
82
+ def displayed?(args={})
83
+ logger.info('Checking if color is displayed')
84
+ raise "Bad RGB: #{rgb}" unless rgb.all?
85
+ frame = args[:frame]
86
+ values = []
87
+ verify(args, values) do |sims|
88
+ if frame.nil?
89
+ json = get_json_for_compare
90
+ sim = test_case.send(:tmc_post, "/api/roi/color/actions/#{dut.id}", json: json)['value']
91
+ else
92
+ json = get_json_for_compare(frame: frame)
93
+ sim = test_case.send(:tmc_post, '/api/roi/color/actions', json: json)['value']
94
+ end
95
+ sim *= 100
96
+ sims << sim
97
+ result = sim >= @similarity
98
+ msg = "Color is#{result ? '' : ' not'} displayed #{frame.nil? ? 'on screen' : 'in frame'} " +
99
+ "(similarity: #{sim.round}%)"
100
+ logger.roi(self, args.merge(message: msg, use_last_image: frame.nil?, screenshot: frame.nil?))
101
+ result
102
+ end
103
+ end
104
+ special_method(:displayed?)
105
+
106
+ # Public: Gets the color of the region defined in the Roi.
107
+ # Corresponds to: api_read_color_from_screen
108
+ #
109
+ # Returns the color as a Hash with keys :red, :green, :blue, each being an Integer value (0 - 255).
110
+ def retrieve(args={})
111
+ logger.info('Retrieving color')
112
+ frame = args[:frame]
113
+ value(args) do
114
+ if frame.nil?
115
+ # Get the color from the screen
116
+ json = get_json_for_get
117
+ color = test_case.send(:tmc_post, "/api/roi/color/actions/#{dut.slot}", json: json)['value']
118
+ else
119
+ # Get the color from the frame
120
+ json = get_json_for_get(frame: frame)
121
+ color = test_case.send(:tmc_post, '/api/roi/color/actions', json: json)['value']
122
+ end
123
+ color = {red: color['red'], green: color['green'], blue: color['blue']}
124
+ logger.roi(self, args.merge(message: "Retrieved color #{color.inspect}", use_last_image: frame.nil?,
125
+ screenshot: frame.nil?))
126
+ color
127
+ end
128
+ end
129
+ special_method(:retrieve)
130
+
131
+ private
132
+
133
+ # Internal: Returns the ROI as a hash.
134
+ def to_json(ref_img: nil)
135
+ super(ref_img: ref_img).merge(threshold: @similarity, red: @red, green: @green, blue: @blue)
136
+ end
137
+
138
+ end
@@ -0,0 +1,187 @@
1
+ require './lib/roi/roi'
2
+ require './lib/mixins/can_have_special_methods'
3
+
4
+ # The ImageRoi class defines an image Roi and its methods
5
+
6
+ class ImageRoi < Roi
7
+ include CanHaveSpecialMethods
8
+
9
+ attr_accessor(:img_x, :img_y, :img_width, :img_height, :similarity)
10
+
11
+ # Public: Initializes an image Roi.
12
+ #
13
+ # dut - Platform (or subclass) instance to which this Roi belongs.
14
+ # x - Integer x coordinate (default: nil).
15
+ # y - Integer y coordinate (default: nil).
16
+ # width - Integer width (default: nil).
17
+ # height - Integer height (default: nil).
18
+ # rectangle - Hash defining rectangle with keys :x, :y, :width, :height (default: nil).
19
+ # element - Hash same as rectangle (default: nil).
20
+ # img_x - Integer secondary Roi x coordinate (default: nil). Required.
21
+ # img_y - Integer secondary Roi y coordinate (default: nil). Required.
22
+ # img_width - Integer secondary Roi width (default: nil). Required.
23
+ # img_height - Integer secondary Roi height (default: nil). Required.
24
+ # ref_img - String path to reference image (default: nil). Required.
25
+ # similarity - Integer image similarity threshold 0 - 100 (default: 80).
26
+ #
27
+ # Returns nothing.
28
+ def initialize(dut, args={})
29
+ args.fetch(:ref_img) # required
30
+ super(dut, args)
31
+ @img_x = args.fetch(:img_x)
32
+ @img_y = args.fetch(:img_y)
33
+ @img_width = args.fetch(:img_width)
34
+ @img_height = args.fetch(:img_height)
35
+ @similarity = args.fetch(:similarity, 80)
36
+ end
37
+
38
+ # Public: Gets image Roi info.
39
+ #
40
+ # Returns a tidy String with image Roi info.
41
+ def info
42
+ "#{super} Img.X=#{@img_x} Img.Y=#{@img_y} Img.Width=#{@img_width} Img.Height=#{@img_height} Similarity=#{@similarity}"
43
+ end
44
+
45
+ # Public: Checks if image is displayed as defined in the given ROI.
46
+ # Corresponds to: api_is_image_area_displayed??
47
+ #
48
+ # key - String name of key to press to trigger evaluation (default: nil).
49
+ # If default, no keys will be pressed.
50
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
51
+ # timeout - Integer total milliseconds to allow before timing out (default: 0).
52
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
53
+ # verifies_for - Integer total milliseconds for which the ROI must verify in order to succeed (default: 0).
54
+ # If default, the ROI must only verify once.
55
+ # priority - Symbol representing evaluation priority used to throttle CPU usage (default: :normal):
56
+ # :critical - Sleep 10 milliseconds between intensive tasks (should be used sparingly).
57
+ # :high - Sleep 100 milliseconds between intensive tasks.
58
+ # :normal - Sleep 1 second between intensive tasks (default).
59
+ # :low - Sleep 10 seconds between intensive tasks.
60
+ # :background - Sleep 1 minute between intensive tasks (should be used sparingly).
61
+ # log_every - Integer interval in milliseconds between logs (default: 1000).
62
+ # ref_img - String path to reference image to override the one in the Roi (default: nil).
63
+ #
64
+ # Returns a Boolean true if image is displayed before the timeout, otherwise false.
65
+ def displayed?(args={})
66
+ logger.info('Checking if image area is displayed')
67
+ scale = args.fetch(:scale, false)
68
+ frame = args[:frame]
69
+ ref_img_json = ref_img_roi_to_json(ref_img: args[:ref_img])
70
+ verify(args) do
71
+ if frame.nil?
72
+ right_roi = to_json
73
+ json = get_json_for_match_2(ref_img_json, right_roi, scale: scale)
74
+ result = test_case.send(:tmc_post, "/api/roi/image/actions/#{dut.slot}", json: json)['value']
75
+ logger.roi(self, args.merge(message: "Image is#{result ? '' : ' not'} displayed on screen",
76
+ use_last_image: true))
77
+ else
78
+ right_roi = to_json(ref_img: frame)
79
+ json = get_json_for_match_2(ref_img_json, right_roi, scale: scale)
80
+ result = test_case.send(:tmc_post, '/api/roi/image/actions', json: json)['value']
81
+ logger.roi(self, args.merge(message: "Image is#{result ? '' : ' not'} displayed in frame", screenshot: false))
82
+ end
83
+ result
84
+ end
85
+ end
86
+ special_method(:displayed?)
87
+
88
+ # TODO: come up with a use for this that makes sense in the context of a specific image Roi (area)
89
+ def retrieve(args={})
90
+ logger.info('Retrieving image area')
91
+ raise 'ImageRoi retrieve not implemented! Did you mean dut.capture_screen?'
92
+ end
93
+ #special_method(:retrieve)
94
+
95
+ # Public: Measures the approximate time for the given image Roi to change.
96
+ # Corresponds to: api_time_for_screen_to_change
97
+ #
98
+ # key - String key press to trigger evaluation (default: nil).
99
+ # If default, no key will be pressed.
100
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
101
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
102
+ # If default, timeout will be calculated as [ delay + 5000 ].
103
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
104
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
105
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
106
+ # :high - Sleep 100 ms between intensive tasks
107
+ # :normal - Sleep 1 second between intensive tasks
108
+ # :low - Sleep 10 seconds between intensive tasks
109
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
110
+ # log_every - Integer total milliseconds between logs (default: 1000).
111
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
112
+ #
113
+ # Returns the Float total milliseconds for the image Roi to change.
114
+ def time_to_change(args={})
115
+ logger.info('Measuring time for image to change')
116
+ scale = args.fetch(:scale, false)
117
+ next_img = dut.capture_screen
118
+ measure(args) do
119
+ roi = to_json(ref_img: next_img)
120
+ json = get_json_for_match_2(roi, roi, scale: scale)
121
+ resp = test_case.send(:tmc_post, "/api/roi/image/actions/#{dut.id}", json: json)
122
+ result = !resp['value']
123
+ logger.roi(self, args.merge(message: "Image #{result ? 'changed' : 'did not change'}", use_last_image: true))
124
+ result
125
+ end
126
+ end
127
+ special_method(:time_to_change)
128
+
129
+ # Public: Measures the precise time for the given image Roi to change.
130
+ # Corresponds to: api_hp_time_for_screen_to_change
131
+ #
132
+ # key - String key press to trigger evaluation (default: nil).
133
+ # If default, no key will be pressed.
134
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
135
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
136
+ # If default, timeout will be calculated as [ delay + 5000 ].
137
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
138
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
139
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
140
+ # :high - Sleep 100 ms between intensive tasks
141
+ # :normal - Sleep 1 second between intensive tasks
142
+ # :low - Sleep 10 seconds between intensive tasks
143
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
144
+ # log_every - Integer total milliseconds between logs (default: 1000).
145
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
146
+ #
147
+ # Returns the Float total milliseconds for the image Roi to change.
148
+ def precise_time_to_change(args={})
149
+ logger.info('Measuring precise time for image to change')
150
+ args[:precise] = true
151
+ scale = args.fetch(:scale, false)
152
+ values = []
153
+ measure(args, values) do |frame, frames|
154
+ roi = to_json(ref_img: frame)
155
+ if frames.empty?
156
+ frames << frame
157
+ result = false #TODO: do we need to implement this?
158
+ logger.roi(self, args.merge(message: "Image #{result ? 'changed' : 'did not change'} on screen",
159
+ use_last_image: true))
160
+ else
161
+ json = get_json_for_match_2(roi, roi, scale: scale)
162
+ resp = test_case.send(:tmc_post, '/api/roi/image/actions', json: json)
163
+ result = !resp['value']
164
+ logger.roi(self, args.merge(message: "Image #{result ? 'changed' : 'did not change'} in frame",
165
+ screenshot: false))
166
+ end
167
+ result
168
+ end
169
+ end
170
+ special_method(:precise_time_to_change)
171
+
172
+ #TODO: Corresponds to: api_time_for_screen_match_file
173
+
174
+ private
175
+
176
+ # Internal: Returns the ROI as a hash.
177
+ def to_json(ref_img: nil)
178
+ super(ref_img: ref_img).merge(threshold: @similarity)
179
+ end
180
+
181
+ # Internal: Returns the reference image ROI as a hash.
182
+ def ref_img_roi_to_json(ref_img: nil)
183
+ {x: @img_x, y: @img_y, width: @img_width, height: @img_height, referenceImage: ref_img || @ref_img,
184
+ threshold: @similarity}
185
+ end
186
+
187
+ end
@@ -0,0 +1,1064 @@
1
+ require 'delegate'
2
+ require './lib/helpers/tmc_helpers/tmc_helpers'
3
+ require './lib/mixins/can_have_special_methods'
4
+
5
+ class Roi
6
+ include CanHaveSpecialMethods
7
+
8
+ attr_accessor(:x, :y, :width, :height, :ref_img)
9
+ attr_reader(:name)
10
+
11
+ # Public: Initializes a base Roi.
12
+ #
13
+ # dut - Platform (or subclass) instance to which this Roi belongs.
14
+ # x - Integer x coordinate (default: nil).
15
+ # y - Integer y coordinate (default: nil).
16
+ # width - Integer width (default: nil).
17
+ # height - Integer height (default: nil).
18
+ # rectangle - Hash defining rectangle with keys :x, :y, :width, :height (default: nil).
19
+ # element - Hash same as rectangle (default: nil).
20
+ # ref_img - String path to reference image (default: nil).
21
+ #
22
+ # Returns nothing.
23
+ def initialize(dut, args={})
24
+ @name = nil
25
+ # Determine ROI name. This will be the first method that calls `new'.
26
+ stack = caller
27
+ last_end = stack.each_index.select do |i|
28
+ stack[i].end_with?("in `new'")
29
+ end.last
30
+ unless last_end.nil?
31
+ match = stack[last_end + 1].match(/`(\w+)'/)
32
+ unless match.nil?
33
+ @name = match[1] unless match[1] == 'run' # ignore dynamic ROIs
34
+ end
35
+ end
36
+ if args.include?(:element)
37
+ self.rectangle=args[:element]
38
+ else
39
+ self.rectangle=(args.fetch(:rectangle, args)) # Get x, y, width, and height from rectangle (if provided) or args
40
+ end
41
+ @ref_img = args.fetch(:ref_img, '')
42
+ @dut = dut
43
+ # These are declared without the convenience methods (TMC monkey patching) so as not to break syntax evaluation.
44
+ @priorities = {
45
+ :critical => 0.01,
46
+ :high => 0.1,
47
+ :normal => 1,
48
+ :low => 10,
49
+ :background => 60
50
+ }
51
+ end
52
+
53
+ # Public: Gets Roi rectangle.
54
+ #
55
+ # Returns Roi rectangle as a Hash with keys :x, :y, :width, :height.
56
+ def rectangle
57
+ {:x => @x, :y => @y, :width => @width, :height => @height}
58
+ end
59
+
60
+ # Public: Sets Roi rectangle.
61
+ #
62
+ # rectangle - Hash with keys :x, :y, :width, and :height from which to set Roi rectangle.
63
+ #
64
+ # Returns nothing.
65
+ def rectangle=(rectangle)
66
+ @x = rectangle[:x]
67
+ @y = rectangle[:y]
68
+ @width = rectangle[:width]
69
+ @height = rectangle[:height]
70
+ end
71
+
72
+ # Public: Gets Roi info.
73
+ #
74
+ # Returns a tidy String with Roi info.
75
+ def info
76
+ "#{self.class.name}: X=#{@x} Y=#{@y} Width=#{@width} Height=#{@height} Ref.Image=#{@ref_img}"
77
+ end
78
+
79
+ # Public: Placeholder for displayed?, which must be implemented by each Roi type.
80
+ def displayed?(*args)
81
+ raise "#{self.class.name} does not implement special method `displayed?'"
82
+ end
83
+
84
+ # Public: Placeholder for retrieve, which must be implemented by each Roi type.
85
+ def retrieve(*args)
86
+ raise "#{self.class.name} does not implement special method `retrieve'"
87
+ end
88
+
89
+ # Public: Waits until the given ROI is displayed.
90
+ # Corresponds to api_wait_till_<ROI TYPE>_displayed?
91
+ #
92
+ # timeout - Integer total milliseconds to allow before timing out.
93
+ # key - String name of key to press to trigger evaluation (default: nil).
94
+ # If default, no keys will be pressed.
95
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
96
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
97
+ # Applies to image ROIs only.
98
+ # verifies_for - Integer total milliseconds for which the ROI must verify in order to succeed (default: 0).
99
+ # If default, the ROI must only verify once.
100
+ # priority - Symbol representing evaluation priority used to throttle CPU usage (default: :normal):
101
+ # :critical - Sleep 10 milliseconds between intensive tasks (should be used sparingly).
102
+ # :high - Sleep 100 milliseconds between intensive tasks.
103
+ # :normal - Sleep 1 second between intensive tasks (default).
104
+ # :low - Sleep 10 seconds between intensive tasks.
105
+ # :background - Sleep 1 minute between intensive tasks (should be used sparingly).
106
+ # log_every - Integer interval in milliseconds between logs (default: 1000).
107
+ # message - String message to log instead of the default (default: nil).
108
+ # Default logs a tailored message.
109
+ #
110
+ # Returns Boolean true if displayed before the timeout, otherwise false.
111
+ def wait_until_displayed?(timeout, args={})
112
+ logger.info("Waiting #{timeout} ms until #{self.class.name} is displayed")
113
+ args[:timeout] = timeout
114
+ displayed?(args)
115
+ end
116
+ special_method(:wait_until_displayed?)
117
+
118
+ # Public: Presses a key until the given Roi is displayed.
119
+ # Corresponds to api_press_key_till_<ROI TYPE>_displayed?
120
+ #
121
+ # key - String name of key to press.
122
+ # presses - Integer maximum number of times to press the key (default: nil).
123
+ # timeout - Integer total milliseconds to allow before timing out (default: 30000).
124
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
125
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
126
+ # Applies to image ROIs only.
127
+ # try_every - Integer total milliseconds to delay between key presses (default: 3000).
128
+ # try_timeout - Integer total milliseconds to allow after each key press before timing out (default: nil).
129
+ # verifies_for - Integer total milliseconds for which the ROI must verify in order to succeed (default: 0).
130
+ # If default, the ROI must only verify once.
131
+ # priority - Symbol representing evaluation priority used to throttle CPU usage (default: :normal):
132
+ # :critical - Sleep 10 milliseconds between intensive tasks (should be used sparingly).
133
+ # :high - Sleep 100 milliseconds between intensive tasks.
134
+ # :normal - Sleep 1 second between intensive tasks (default).
135
+ # :low - Sleep 10 seconds between intensive tasks.
136
+ # :background - Sleep 1 minute between intensive tasks (should be used sparingly).
137
+ # log_every - Integer interval in milliseconds between logs (default: 1000).
138
+ # message - String message to log instead of the default (default: nil).
139
+ # Default logs a tailored message.
140
+ #
141
+ # Returns Boolean true if displayed before the timeout, otherwise false.
142
+ def press_key_until_displayed?(key, args={})
143
+ logger.info("Pressing key #{key.inspect} until #{self.class.name} is displayed")
144
+ timeout_s = args.fetch(:timeout, 30.sec) / 1.sec
145
+ args[:timeout] = args[:try_timeout]
146
+ key_delay = args.fetch(:try_every, 3.sec)
147
+ presses = args[:presses]
148
+ press_count = 0
149
+ start_time = Time.now
150
+ displayed = false
151
+ loop do
152
+ displayed = displayed?(args)
153
+ break if displayed
154
+ if presses.nil?
155
+ break if (Time.now - start_time) > timeout_s
156
+ elsif press_count == presses
157
+ break
158
+ end
159
+ @dut.press_key(key, :sleep_time => key_delay)
160
+ press_count += 1
161
+ end
162
+ displayed
163
+ end
164
+ special_method(:press_key_until_displayed?)
165
+
166
+ # Public: Measures the approximate time for the given Roi to be displayed.
167
+ # Corresponds to: api_time_to_display_<ROI TYPE>
168
+ #
169
+ # key - String key press to trigger evaluation (default: nil).
170
+ # If default, no key will be pressed.
171
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
172
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
173
+ # If default, timeout will be calculated as [ delay + 5000 ].
174
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
175
+ # Applies to image ROIs only.
176
+ # expected - Boolean expected result of evaluation or Array of expected transition values (default: true).
177
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
178
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
179
+ # :high - Sleep 100 ms between intensive tasks
180
+ # :normal - Sleep 1 second between intensive tasks
181
+ # :low - Sleep 10 seconds between intensive tasks
182
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
183
+ # log_every - Integer total milliseconds between logs (default: 1000).
184
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
185
+ #
186
+ # Returns the Float total milliseconds for the ROI to be displayed.
187
+ def time_to_display(args={})
188
+ logger.info("Measuring time to display #{self.class.name}")
189
+ measure(args) do
190
+ displayed?(:set_roi_options => args)
191
+ end
192
+ end
193
+ special_method(:time_to_display)
194
+
195
+ # Public: Measures the precise time for the given Roi to be displayed.
196
+ # Corresponds to: api_hp_time_to_display_<ROI TYPE>
197
+ #
198
+ # key - String key press to trigger evaluation (default: nil).
199
+ # If default, no key will be pressed.
200
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
201
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
202
+ # If default, timeout will be calculated as [ delay + 5000 ].
203
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
204
+ # Applies to image ROIs only.
205
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
206
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
207
+ # :high - Sleep 100 ms between intensive tasks
208
+ # :normal - Sleep 1 second between intensive tasks
209
+ # :low - Sleep 10 seconds between intensive tasks
210
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
211
+ # log_every - Integer total milliseconds between logs (default: 1000).
212
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
213
+ #
214
+ # Returns the Float total milliseconds for the Roi to be displayed.
215
+ def precise_time_to_display(args={})
216
+ logger.info("Measuring precise time to display #{self.class.name}")
217
+ args[:precise] = true
218
+ args[:with_last_frame] = true
219
+ measure(args) do |frame, last_frame|
220
+ displayed?(:frame => frame, :last_frame => last_frame, :set_roi_options => args)
221
+ end
222
+ end
223
+ special_method(:precise_time_to_display)
224
+
225
+ # Public: Measures the precise time for the given Roi to match on the specified DUT.
226
+ #
227
+ # other_dut - Platform (or subclass) instance of DUT to match.
228
+ # timeout - Integer total milliseconds to allow before timing out.
229
+ # key - String key press to trigger evaluation (default: nil).
230
+ # If default, no key will be pressed.
231
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
232
+ # report - Boolean indicating whether to report measurements to ITMS (default: true). NOT YET IMPLEMENTED.
233
+ #
234
+ # Returns the Float total milliseconds for the Roi to disappear.
235
+ def precise_time_to_match_dut(other_dut, timeout, args={})
236
+ #TODO: this probably needs some work for the new EE
237
+ msg = "Measuring precise time for #{info} to match DUT #{other_dut.model}:#{other_dut.slot}"
238
+ logger.roi(self, args.merge(:message => msg, :screenshot => false))
239
+ key = args[:key]
240
+ delay = args.fetch(:delay, 0)
241
+ other_roi = args[:other_roi]
242
+ left_frames = []
243
+ right_frames = []
244
+ test_case.add_teardown('Cleaning up captured frames') do
245
+ json = get_json_for_test.merge(files: (left_frames + right_frames).map {|frm| frm['path']})
246
+ test_case.send(:tmc_delete, '/api/images', json: json )
247
+ end
248
+ # Press key if specified
249
+ unless key.nil?
250
+ do_trigger(key, :duts => [dut, other_dut])
251
+ end
252
+ # Delay if specified
253
+ if delay > 0
254
+ sleep(delay / 1000.0) # this is native sleep
255
+ end
256
+ # Capture frames for the duration
257
+ json1 = get_json_for_iter.merge(durationMs: timeout)
258
+ threads = [
259
+ Thread.new do
260
+ resp = test_case.send(:tmc_post, "/api/images/record/#{dut.slot}", json: json1)
261
+ left_frames += resp.fetch('images')
262
+ end,
263
+ Thread.new do
264
+ resp = test_case.send(:tmc_post, "/api/images/record/#{other_dut.slot}", json: json1)
265
+ right_frames += resp.fetch('images')
266
+ end
267
+ ]
268
+ threads.each { |thr| thr.join } # wait all threads
269
+ if left_frames.empty? || right_frames.empty?
270
+ raise 'Not enough images captured for analysis!'
271
+ end
272
+ # Send frames for processing
273
+ if other_roi.nil?
274
+ right_roi = rectangle
275
+ else
276
+ right_roi = other_roi.rectangle
277
+ end
278
+ right_roi.update(:threshold => threshold) unless right_roi.nil?
279
+ json2 = get_json_for_compare_2(rectangle, right_roi, left_frames: left_frames, right_frames: right_frames)
280
+ result = test_case.send(:tmc_post, '/api/roi/video/actions', json: json2)['value']
281
+ # TODO: figure out which frame(s) and display them
282
+ logger.roi(self, args.merge(message: "#{result.nil? ? 'no ' : ''}matching frames found".capitalize,
283
+ screenshot: false))
284
+ logger.duration(result, message: 'Time to match') unless result.nil?
285
+ result
286
+ end
287
+ special_method(:precise_time_to_display)
288
+
289
+ # Public: Returns true if the given Roi disappears within the given time.
290
+ # api_wait_till_<ROI TYPE>_not_displayed?
291
+ #
292
+ # timeout - Integer total milliseconds to allow before timing out.
293
+ # key - String key press to trigger evaluation (default: nil).
294
+ # If default, no key will be pressed.
295
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
296
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
297
+ # Applies to image ROIs only.
298
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
299
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
300
+ # :high - Sleep 100 ms between intensive tasks
301
+ # :normal - Sleep 1 second between intensive tasks
302
+ # :low - Sleep 10 seconds between intensive tasks
303
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
304
+ # log_every - Integer total milliseconds between logs (default: 1000).
305
+ #
306
+ # Returns a Boolean true if the Roi disappears before the timeout, otherwise false.
307
+ def wait_until_not_displayed?(timeout, args={})
308
+ logger.info("Waiting #{timeout} ms until #{self.class.name} is not displayed")
309
+ args[:timeout] = timeout
310
+ args[:expected] = false
311
+ displayed?(args)
312
+ end
313
+ special_method(:wait_until_not_displayed?)
314
+
315
+ # Public: Measures the approximate time for the given Roi to disappear.
316
+ # Corresponds to: api_time_for_<ROI TYPE>_to_disappear
317
+ #
318
+ # key - String key press to trigger evaluation (default: nil).
319
+ # If default, no key will be pressed.
320
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
321
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
322
+ # If default, timeout will be calculated as [ delay + 5000 ].
323
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
324
+ # Applies to image ROIs only.
325
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
326
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
327
+ # :high - Sleep 100 ms between intensive tasks
328
+ # :normal - Sleep 1 second between intensive tasks
329
+ # :low - Sleep 10 seconds between intensive tasks
330
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
331
+ # log_every - Integer total milliseconds between logs (default: 1000).
332
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
333
+ #
334
+ # Returns the Float total milliseconds for the ROI to disappear.
335
+ def time_to_disappear(args={})
336
+ logger.info("Measuring time for #{self.class.name} to disappear")
337
+ measure(args) do
338
+ displayed?(:expected => false, :set_roi_options => args)
339
+ end
340
+ end
341
+ special_method(:time_to_disappear)
342
+
343
+ # Public: Measures the precise time for the given Roi to disappear.
344
+ # Corresponds to: api_hp_time_for_<ROI TYPE>_to_disappear
345
+ #
346
+ # key - String key press to trigger evaluation (default: nil).
347
+ # If default, no key will be pressed.
348
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
349
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
350
+ # If default, timeout will be calculated as [ delay + 5000 ].
351
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
352
+ # Applies to image ROIs only.
353
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
354
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
355
+ # :high - Sleep 100 ms between intensive tasks
356
+ # :normal - Sleep 1 second between intensive tasks
357
+ # :low - Sleep 10 seconds between intensive tasks
358
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
359
+ # log_every - Integer total milliseconds between logs (default: 1000).
360
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
361
+ #
362
+ # Returns the Float total milliseconds for the Roi to disappear.
363
+ def precise_time_to_disappear(args={})
364
+ logger.info("Measuring precise time for #{self.class.name} to disappear")
365
+ args[:precise] = true
366
+ args[:with_last_frame] = true
367
+ measure(args) do |frame, last_frame|
368
+ displayed?(:frame => frame, :last_frame => last_frame, :expected => false, :set_roi_options => args)
369
+ end
370
+ end
371
+ special_method(:precise_time_to_disappear)
372
+
373
+ # Public: Returns true if the given Roi transitions before the specified timeout from false to true to false.
374
+ # Corresponds to: api_wait_for_<ROI TYPE>_transition?
375
+ #
376
+ # timeout - Integer total milliseconds to allow before timing out.
377
+ # key - String key press to trigger evaluation (default: nil).
378
+ # If default, no key will be pressed.
379
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
380
+ # expected - Array of expected transition values (default: [true, false]).
381
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
382
+ # Applies to image ROIs only.
383
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
384
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
385
+ # :high - Sleep 100 ms between intensive tasks
386
+ # :normal - Sleep 1 second between intensive tasks
387
+ # :low - Sleep 10 seconds between intensive tasks
388
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
389
+ # log_every - Integer total milliseconds between logs (default: 1000).
390
+ #
391
+ # Returns a Boolean true if the Roi transitioned before the timeout, otherwise false.
392
+ def wait_for_transition?(timeout, args={})
393
+ logger.info("Waiting #{timeout} ms for #{self.class.name} transition")
394
+ args[:timeout] = timeout
395
+ args[:expected] ||= [true, false]
396
+ displayed?(args)
397
+ end
398
+ special_method(:wait_for_transition?)
399
+
400
+ # Public: Measures the approximate time for the given Roi to transition from false to true to false.
401
+ # Corresponds to: api_time_for_<ROI TYPE>_transition
402
+ #
403
+ # key - String key press to trigger evaluation (default: nil).
404
+ # If default, no key will be pressed.
405
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
406
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
407
+ # If default, timeout will be calculated as [ delay + 5000 ].
408
+ # expected - Array of expected transition values (default: [true, false]).
409
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
410
+ # Applies to image ROIs only.
411
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
412
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
413
+ # :high - Sleep 100 ms between intensive tasks
414
+ # :normal - Sleep 1 second between intensive tasks
415
+ # :low - Sleep 10 seconds between intensive tasks
416
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
417
+ # log_every - Integer total milliseconds between logs (default: 1000).
418
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
419
+ #
420
+ # Returns the Float total milliseconds for the ROI to transition.
421
+ def time_to_transition(args={})
422
+ logger.info("Measuring time for #{self.class.name} to transition")
423
+ args[:expected] ||= [true, false]
424
+ measure(args) do
425
+ displayed?(:set_roi_options => args)
426
+ end
427
+ end
428
+ special_method(:time_to_transition)
429
+
430
+ # Public: Measures the precise time for the given Roi to transition from false to true to false.
431
+ # Corresponds to: api_hp_time_for_<ROI TYPE>_transition
432
+ #
433
+ # key - String key press to trigger evaluation (default: nil).
434
+ # If default, no key will be pressed.
435
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
436
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
437
+ # If default, timeout will be calculated as [ delay + 5000 ].
438
+ # expected - Array of expected transition values (default: [true, false]).
439
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
440
+ # Applies to image ROIs only.
441
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
442
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
443
+ # :high - Sleep 100 ms between intensive tasks
444
+ # :normal - Sleep 1 second between intensive tasks
445
+ # :low - Sleep 10 seconds between intensive tasks
446
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
447
+ # log_every - Integer total milliseconds between logs (default: 1000).
448
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
449
+ #
450
+ # Returns the Float total milliseconds for the Roi to transition.
451
+ def precise_time_to_transition(args={})
452
+ logger.info("Measuring precise time for #{self.class.name} to transition")
453
+ args[:expected] ||= [true, false]
454
+ args[:precise] = true
455
+ measure(args) do |frame|
456
+ displayed?(:frame => frame, :set_roi_options => args)
457
+ end
458
+ end
459
+ special_method(:precise_time_to_transition)
460
+
461
+ # Public: Returns true if the given Roi changes before the specified timeout.
462
+ #
463
+ # timeout - Integer total milliseconds to allow before timing out.
464
+ # key - String key press to trigger evaluation (default: nil).
465
+ # If default, no key will be pressed.
466
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
467
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
468
+ # Applies to image ROIs only.
469
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
470
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
471
+ # :high - Sleep 100 ms between intensive tasks
472
+ # :normal - Sleep 1 second between intensive tasks
473
+ # :low - Sleep 10 seconds between intensive tasks
474
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
475
+ # log_every - Integer total milliseconds between logs (default: 1000).
476
+ #
477
+ # Returns a Boolean true if the Roi changed before the timeout, otherwise false.
478
+ def wait_for_change?(timeout, args={})
479
+ logger.info("Waiting #{timeout} ms for #{self.class.name} to change")
480
+ args[:timeout] = timeout
481
+ set_roi_options(args)
482
+ first = retrieve
483
+ verify(args) do
484
+ retrieve != first
485
+ end
486
+ end
487
+ special_method(:wait_for_change?)
488
+
489
+ # Public: Measures the approximate time for the given Roi to change.
490
+ # Corresponds to: api_time_to_<ROI TYPE>_change
491
+ #
492
+ # key - String key press to trigger evaluation (default: nil).
493
+ # If default, no key will be pressed.
494
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
495
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
496
+ # If default, timeout will be calculated as [ delay + 5000 ].
497
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
498
+ # Applies to image ROIs only.
499
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
500
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
501
+ # :high - Sleep 100 ms between intensive tasks
502
+ # :normal - Sleep 1 second between intensive tasks
503
+ # :low - Sleep 10 seconds between intensive tasks
504
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
505
+ # log_every - Integer total milliseconds between logs (default: 1000).
506
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
507
+ #
508
+ # Returns the Float total milliseconds for the Roi to change.
509
+ def time_to_change(args={})
510
+ logger.info("Measuring time for #{self.class.name} to change")
511
+ set_roi_options(args)
512
+ first = retrieve
513
+ measure(args) do
514
+ retrieve != first
515
+ end
516
+ end
517
+ special_method(:time_to_change)
518
+
519
+ # Public: Measures the precise time for the given Roi to change.
520
+ # Corresponds to: api_hp_time_to_<ROI TYPE>_change
521
+ #
522
+ # key - String key press to trigger evaluation (default: nil).
523
+ # If default, no key will be pressed.
524
+ # delay - Integer total milliseconds to delay before starting evaluation (default: 0).
525
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
526
+ # If default, timeout will be calculated as [ delay + 5000 ].
527
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
528
+ # Applies to image ROIs only.
529
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
530
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
531
+ # :high - Sleep 100 ms between intensive tasks
532
+ # :normal - Sleep 1 second between intensive tasks
533
+ # :low - Sleep 10 seconds between intensive tasks
534
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
535
+ # log_every - Integer total milliseconds between logs (default: 1000).
536
+ # report - Boolean indicating whether to report measurements to ITMS (default: true).
537
+ #
538
+ # Returns the Float total milliseconds for the Roi to change.
539
+ def precise_time_to_change(args={})
540
+ logger.info("Measuring precise time for #{self.class.name} to change")
541
+ args[:precise] = true
542
+ set_roi_options(args)
543
+ values = [retrieve]
544
+ measure(args, values) do |frame, vals|
545
+ value = retrieve(:frame => frame)
546
+ vals << value
547
+ value != vals.first
548
+ end
549
+ end
550
+ special_method(:precise_time_to_change)
551
+
552
+ # Public: Finds the frame in which the given Roi verifies.
553
+ # Corresponds to: api_find_<ROI TYPE>_frame
554
+ #
555
+ # frames - Array of frames to search, each being a Hash with the following keys:
556
+ # :filename - String full path to the frame on the server.
557
+ # :capturedAt - Time at which the frame was captured.
558
+ # :keep - Boolean indicating whether to keep the frame if cleanup is true. Initializes false.
559
+ # start_time - Time at which frame capture began.
560
+ # starting_frame - Integer index of frame at which to start evaluation (default: 0).
561
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
562
+ # If default, all frames will be searched.
563
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
564
+ # Applies to image ROIs only.
565
+ # verifies_for - Integer total milliseconds for which the ROI must continuously verify in order to be counted
566
+ # successful (default: 0).
567
+ # If default, the ROI must only verify once.
568
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
569
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
570
+ # :high - Sleep 100 ms between intensive tasks
571
+ # :normal - Sleep 1 second between intensive tasks
572
+ # :low - Sleep 10 seconds between intensive tasks
573
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
574
+ # log_every - Integer total milliseconds between logs (default: 1000).
575
+ # report - Boolean indicating whether to report measurements to ITMS (default: false).
576
+ #
577
+ # Returns the Integer index of the matching frame.
578
+ def find_frame_displayed(frames, start_time, args={})
579
+ logger.info("Finding frame where #{self.class.name} is displayed")
580
+ args[:with_last_frame] = true
581
+ args[:report] = false
582
+ if frames.count < 2
583
+ default_timeout = 30.sec
584
+ else
585
+ default_timeout = test_case.get_time_delta(frames.first[:capturedAt], frames.last[:capturedAt])
586
+ end
587
+ args[:timeout] ||= default_timeout
588
+ frame(frames, start_time, args) do |frame, last_frame|
589
+ displayed?(:frame => frame, :last_frame => last_frame, :set_roi_options => args)
590
+ end
591
+ end
592
+ special_method(:find_frame_displayed)
593
+
594
+ # Public: Finds the frame in which the given Roi does not verify.
595
+ # Corresponds to: api_find_non_<ROI TYPE>_frame
596
+ #
597
+ # frames - Array of frames to search, each being a Hash with the following keys:
598
+ # :filename - String full path to the frame on the server.
599
+ # :capturedAt - Time at which the frame was captured.
600
+ # :keep - Boolean indicating whether to keep the frame if cleanup is true. Initializes false.
601
+ # start_time - Time at which frame capture began.
602
+ # starting_frame - Integer index of frame at which to start evaluation (default: 0).
603
+ # timeout - Integer total milliseconds to allow before timing out (default: nil).
604
+ # If default, all frames will be searched.
605
+ # scale - Boolean if the larger image should be scaled to the size of the smaller image (default: false).
606
+ # Applies to image ROIs only.
607
+ # verifies_for - Integer total milliseconds for which the ROI must continuously verify in order to be counted
608
+ # successful (default: 0).
609
+ # If default, the ROI must only verify once.
610
+ # priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
611
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
612
+ # :high - Sleep 100 ms between intensive tasks
613
+ # :normal - Sleep 1 second between intensive tasks
614
+ # :low - Sleep 10 seconds between intensive tasks
615
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
616
+ # log_every - Integer total milliseconds between logs (default: 1000).
617
+ # report - Boolean indicating whether to report measurements to ITMS (default: false).
618
+ #
619
+ # Returns the Integer index of the matching frame.
620
+ def find_frame_not_displayed(frames, start_time, args={})
621
+ logger.info("Finding frame where #{self.class.name} is not displayed")
622
+ args[:with_last_frame] = true
623
+ args[:expected] = false
624
+ args[:report] = false
625
+ frame(frames, start_time, args) do |frame, last_frame|
626
+ displayed?(:frame => frame, :last_frame => last_frame, :set_roi_options => args)
627
+ end
628
+ end
629
+ special_method(:find_frame_not_displayed)
630
+
631
+ private
632
+
633
+ # Internal: Gets JSON for get.
634
+ def get_json_for_get(frame: nil, roi: nil)
635
+ get_json_for_action('get').merge(roi: roi || to_json(ref_img: frame))
636
+ end
637
+
638
+ # Internal: Gets JSON for match.
639
+ def get_json_for_match(frame: nil, roi: nil)
640
+ get_json_for_action('match').merge(roi: roi || to_json(ref_img: frame))
641
+ end
642
+
643
+ # Internal: Gets JSON for compare.
644
+ def get_json_for_compare(frame: nil, roi: nil)
645
+ get_json_for_action('compare').merge(roi: roi || to_json(ref_img: frame))
646
+ end
647
+
648
+ # Internal: Gets JSON for Left/Right match.
649
+ def get_json_for_match_2(left_roi, right_roi, scale: nil)
650
+ json = get_json_for_action('match').merge(leftRoi: left_roi, rightRoi: right_roi)
651
+ json.update(scale: scale) unless scale.nil?
652
+ json
653
+ end
654
+
655
+ # Internal: Gets JSON for Left/Right compare.
656
+ def get_json_for_compare_2(left_roi, right_roi, left_frames: nil, right_frames: nil, scale: nil)
657
+ json = get_json_for_action('compare').merge(leftRoi: left_roi, rightRoi: right_roi)
658
+ json.update(leftFrames: left_frames) unless left_frames.nil?
659
+ json.update(rightFrames: right_frames) unless right_frames.nil?
660
+ json.update(scale: scale) unless scale.nil?
661
+ json
662
+ end
663
+
664
+ # Internal: Gets JSON populated with job, test, and iteration for the specified action.
665
+ def get_json_for_action(action)
666
+ get_json_for_iter.merge(action: action)
667
+ end
668
+
669
+ # Internal: Gets JSON populated with job and test.
670
+ def get_json_for_test
671
+ {job: test_case.job, test: test_case.id}
672
+ end
673
+
674
+ # Internal: Gets JSON populated with job, test, and iteration.
675
+ def get_json_for_iter
676
+ get_json_for_test.merge(iteration: test_case.iteration)
677
+ end
678
+
679
+ # Internal: Returns the ROI as a hash.
680
+ def to_json(ref_img: nil)
681
+ rectangle.merge(referenceImage: ref_img || @ref_img)
682
+ end
683
+
684
+ # Internal: Returns the dut object.
685
+ def dut
686
+ @dut
687
+ end
688
+
689
+ # Internal: Returns the test case object.
690
+ def test_case
691
+ dut.send(:test_case)
692
+ end
693
+
694
+ # Internal: Returns the logger object.
695
+ def logger
696
+ test_case.send(:logger_for_device, @dut.id)
697
+ end
698
+
699
+ # Internal: Sets Roi options from the given arguments.
700
+ def set_roi_options(args)
701
+ # Individual Roi classes should use this as needed to set type-specific Roi options
702
+ end
703
+
704
+ # Internal: Returns true if the actual result verifies against the expected result.
705
+ def verifies?(expected, actual)
706
+ !actual.nil? && (expected.nil? || actual.eql?(expected) || (expected.is_a?(Regexp) && actual =~ expected))
707
+ end
708
+
709
+ # Internal: Returns true if the given Roi verifies for the specified duration, otherwise false.
710
+ # args - Hash of arguments:
711
+ # :key - String key press to trigger evaluation (default: nil).
712
+ # If default, no key will be pressed.
713
+ # :expected - Object expected value from yielding the given block (default: true).
714
+ # If an Array is provided, the measurement will expect a transition.
715
+ # :precise - Boolean indicating whether to evaluate with high precision (default: false).
716
+ # :delay - Integer total milliseconds to delay before starting evaluation (default: 0).
717
+ # :scale - Boolean if the larger image should be scaled to the size of the smaller image
718
+ # (default: false). Applies to image ROIs only.
719
+ # :verifies_for - Integer total milliseconds for which the ROI must continuously verify in order to be
720
+ # counted successful (default: 0). If default, the ROI must only verify once.
721
+ # :timeout - Integer total milliseconds to allow before timing out (default: nil).
722
+ # If default, timeout will be calculated as [ delay + verifies_for + 5000 ].
723
+ # :priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
724
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
725
+ # :high - Sleep 100 ms between intensive tasks
726
+ # :normal - Sleep 1 second between intensive tasks
727
+ # :low - Sleep 10 seconds between intensive tasks
728
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
729
+ # :log_every - Integer total milliseconds between logs (default: 1000).
730
+ # :with_last_frame - Boolean indicating whether to pass last frame to block (default: false).
731
+ # :message - String custom message to log (default: nil).
732
+ # block_args - Splat Array of arguments to pass to the given block.
733
+ # block - Block Reference for block to yield.
734
+ def verify(args, *block_args, &block)
735
+ args[:timeout] ||= 0.sec if args[:delay].nil? && args[:verifies_for].nil?
736
+ evaluate(:verify, args, *block_args, &block)
737
+ end
738
+
739
+ # Internal: Returns the time measured for the given Roi to verify for the specified duration, or nil.
740
+ # args - Hash of arguments:
741
+ # :key - String key press to trigger evaluation (default: nil).
742
+ # If default, no key will be pressed.
743
+ # :expected - Object expected value from yielding the given block (default: true).
744
+ # If an Array is provided, the measurement will expect a transition.
745
+ # :precise - Boolean indicating whether to evaluate with high precision (default: false).
746
+ # :delay - Integer total milliseconds to delay before starting evaluation (default: 0).
747
+ # :scale - Boolean if the larger image should be scaled to the size of the smaller image
748
+ # (default: false). Applies to image ROIs only.
749
+ # :verifies_for - Integer total milliseconds for which the ROI must continuously verify in order to be
750
+ # counted successful (default: 0). If default, the ROI must only verify once.
751
+ # :timeout - Integer total milliseconds to allow before timing out (default: nil).
752
+ # If default, timeout will be calculated as [ delay + verifies_for + 5000 ].
753
+ # :priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
754
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
755
+ # :high - Sleep 100 ms between intensive tasks
756
+ # :normal - Sleep 1 second between intensive tasks
757
+ # :low - Sleep 10 seconds between intensive tasks
758
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
759
+ # :log_every - Integer total milliseconds between logs (default: 1000).
760
+ # :report - Boolean indicating whether to report measurements to ITMS (default: true).
761
+ # :execution_metric - String name of execution metric to report (default: nil).
762
+ # :with_last_frame - Boolean indicating whether to pass last frame to block (default: false).
763
+ # :message - String custom message to log (default: nil).
764
+ # block_args - Splat Array of arguments to pass to the given block.
765
+ # block - Block Reference for block to yield.
766
+ def measure(args, *block_args, &block)
767
+ args[:priority] ||= :high # use a higher default priority
768
+ # Use a higher default timeout
769
+ if args[:delay].nil? && args[:verifies_for].nil?
770
+ args[:timeout] ||= args[:precise] ? 10.sec : 30.sec
771
+ end
772
+ evaluate(:measure, args, *block_args, &block)
773
+ end
774
+
775
+ # Internal: Returns the value of the given Roi.
776
+ # args - Hash of arguments:
777
+ # :key - String key press to trigger evaluation (default: nil).
778
+ # If default, no key will be pressed.
779
+ # :delay - Integer total milliseconds to delay before starting evaluation (default: 0).
780
+ # :message - String custom message to log (default: nil).
781
+ # block_args - Splat Array of arguments to pass to the given block.
782
+ # block - Block Reference for block to yield.
783
+ def value(args, *block_args, &block)
784
+ # Override timeout if we are just retrieving the value
785
+ args[:timeout] = 0.sec
786
+ args[:timeout] += args[:delay] unless args[:delay].nil?
787
+ evaluate(:value, args, *block_args, &block)
788
+ end
789
+
790
+ # Internal: Returns the index of the frame in which the given Roi verifies, or -1.
791
+ # frames - Array of frames, each being a Hash with the following keys:
792
+ # :filename - String full path to the frame on the server.
793
+ # :capturedAt - Time at which the frame was captured.
794
+ # :keep - Boolean indicating whether to keep the frame if cleanup is true. Initializes false.
795
+ # start_time - Time at which frame capture began.
796
+ # args - Hash of arguments:
797
+ # :starting_frame - Integer index of frame at which to start evaluation (default: 0).
798
+ # :expected - Object expected value from yielding the given block (default: true).
799
+ # If an Array is provided, the measurement will expect a transition.
800
+ # :verifies_for - Integer total milliseconds for which the ROI must continuously verify in order to be
801
+ # counted successful (default: 0). If default, the ROI must only verify once.
802
+ # :timeout - Integer total milliseconds to allow before timing out (default: nil).
803
+ # If default, all frames will be searched.
804
+ # :scale - Boolean if the larger image should be scaled to the size of the smaller image
805
+ # (default: false). Applies to image ROIs only.
806
+ # :priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
807
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
808
+ # :high - Sleep 100 ms between intensive tasks
809
+ # :normal - Sleep 1 second between intensive tasks
810
+ # :low - Sleep 10 seconds between intensive tasks
811
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
812
+ # :log_every - Integer total milliseconds between logs (default: 1000).
813
+ # :report - Boolean indicating whether to report measurements to ITMS (default: true).
814
+ # :execution_metric - String name of execution metric to report (default: nil).
815
+ # :with_last_frame - Boolean indicating whether to pass last frame to block (default: false).
816
+ # :message - String custom message to log (default: nil).
817
+ # block_args - Splat Array of arguments to pass to the given block.
818
+ # block - Block Reference for block to yield.
819
+ def frame(frames, start_time, args, *block_args, &block)
820
+ args[:precise] = true
821
+ args[:priority] ||= :high # use a higher default priority
822
+ # Use a higher default timeout
823
+ args[:timeout] ||= 5.min # should search all frames unless someone went nuts with the capture
824
+ args[:frames] = frames
825
+ args[:starting_frame] ||= 0
826
+ args[:start_time] = start_time
827
+ evaluate(:frame, args, *block_args, &block)
828
+ end
829
+
830
+ # Internal: Evaluates the given Roi for the specified duration, or times out.
831
+ # args - Hash of arguments:
832
+ # :type - Symbol type of evaluation:
833
+ # :verify - Return true if the Roi verifies, otherwise false.
834
+ # :measure - Return the time in ms for the Roi to verify, or nil.
835
+ # :value - Return the Roi value.
836
+ # :frame - Return the frame in which the Roi verifies.
837
+ # :key - String key press to trigger evaluation (default: nil).
838
+ # If default, no key will be pressed.
839
+ # :expected - Object expected value from yielding the given block (default: true).
840
+ # If an Array is provided, the measurement will expect a transition.
841
+ # :precise - Boolean indicating whether to evaluate with high precision (default: false).
842
+ # :delay - Integer total milliseconds to delay before starting evaluation (default: 0).
843
+ # :scale - Boolean if the larger image should be scaled to the size of the smaller image
844
+ # (default: false). Applies to image ROIs only.
845
+ # :verifies_for - Integer total milliseconds for which the ROI must continuously verify in order to be
846
+ # counted successful (default: 0). If default, the ROI must only verify once.
847
+ # :timeout - Integer total milliseconds to allow before timing out (default: nil).
848
+ # If default, timeout will be calculated as [ delay + verifies_for + 5000 ].
849
+ # :priority - Symbol evaluation priority used to throttle CPU usage (default: :normal):
850
+ # :critical - Sleep 10 ms between intensive tasks (USE SPARINGLY)
851
+ # :high - Sleep 100 ms between intensive tasks
852
+ # :normal - Sleep 1 second between intensive tasks
853
+ # :low - Sleep 10 seconds between intensive tasks
854
+ # :background - Sleep 1 minute between intensive tasks (USE SPARINGLY)
855
+ # :log_every - Integer total milliseconds between logs (default: 1000).
856
+ # :report - Boolean indicating whether to report measurements to ITMS (default: true).
857
+ # :execution_metric - String name of execution metric to report (default: nil).
858
+ # :with_last_frame - Boolean indicating whether to pass last frame to block (default: false).
859
+ # :message - String custom message to log (default: nil).
860
+ # :frames - Array of frames to use, each being a Hash with the following keys (default: nil):
861
+ # :filename - String full path to the frame on the server.
862
+ # :capturedAt - Time at which the frame was captured.
863
+ # :keep - Boolean indicating whether to keep the frame if cleanup is true.
864
+ # Initializes false.
865
+ # If default, frames will be captured as needed.
866
+ # :start_time - Time at which evaluation began (default: nil).
867
+ # If default, an appropriate start Time will be used.
868
+ # block_args - Splat Array of arguments to pass to the given block.
869
+ # block - Block Reference for block to yield.
870
+ def evaluate(type, args, *block_args, &block)
871
+ case type
872
+ when :verify
873
+ log_action = 'verifying'
874
+ log_state = 'verified'
875
+ when :measure
876
+ log_action = 'measuring'
877
+ log_state = 'measured'
878
+ when :value
879
+ log_action = 'retrieving'
880
+ log_state = 'retrieved'
881
+ when :frame
882
+ log_action = 'finding frame for'
883
+ log_state = 'found in frame'
884
+ end
885
+ # DO NOT MODIFY ARGS IN THIS FUNCTION
886
+ msg = "#{args[:message] || log_action.capitalize} #{info}"
887
+ logger.roi(self, args.merge(:message => msg, :screenshot => false))
888
+ # Get arguments
889
+ with_last_frame = args.fetch(:with_last_frame, false)
890
+ key = args[:key]
891
+ expected = args.fetch(:expected, true)
892
+ expected = [expected] unless expected.is_a?(Array)
893
+ precise = args.fetch(:precise, false)
894
+ delay = args.fetch(:delay, 0)
895
+ verifies_for = args.fetch(:verifies_for, 0)
896
+ timeout = args[:timeout] || delay + verifies_for + 5.sec
897
+ #TODO: put back?
898
+ #if precise && timeout > (delay + 5.sec)
899
+ # raise "Timeout (#{timeout} ms) cannot be greater than delay + 5 sec! Try increasing delay or using a non-precise method."
900
+ #end
901
+ if timeout < (delay + verifies_for)
902
+ raise "Timeout (#{timeout} ms) cannot be less than delay (#{delay} ms) + verifies_for (#{verifies_for} ms)!"
903
+ end
904
+ frames = args.fetch(:frames, [])
905
+ starting_frame = args.fetch(:starting_frame, 0)
906
+ priority = args.fetch(:priority, :normal)
907
+ report = args.fetch(:report, true)
908
+ execution_metric = args[:execution_metric]
909
+ log_every = args.fetch(:log_every, 1.sec)
910
+ min_log_every = (timeout / 100.0).round # log a max of 100 frames
911
+ if log_every < min_log_every
912
+ logger.warn("Using `log_every': #{min_log_every} ms.")
913
+ log_every = min_log_every
914
+ end
915
+ next_log = log_every
916
+ start_time = args.fetch(:start_time, nil)
917
+ result = nil
918
+ if precise
919
+ # For a high-precision (HP) measurement, capture frames if necessary
920
+ if frames.empty?
921
+ cap = dut.capture_frames(timeout, :key => key)
922
+ frames = cap[:frames]
923
+ start_time = cap[:start_time]
924
+ end
925
+ raise 'Not enough images captured for analysis!' if frames.empty?
926
+ else
927
+ # For a non-high-precision evaluation, we just trigger the evaluation and start the clock
928
+ unless key.nil?
929
+ do_trigger(key)
930
+ end
931
+ start_time = Time.now
932
+ if delay > 0
933
+ sleep(delay / 1000.0) # this is native sleep
934
+ end
935
+ end
936
+ i = starting_frame
937
+ i += 1 if with_last_frame # start on the second frame
938
+ expected_now = expected.shift
939
+ verified = false
940
+ while true
941
+ logger.debug("Expected result: #{expected_now}")
942
+ skip = false
943
+ if precise
944
+ # For HP measurement, look at the next frame
945
+ frame_info = frames[i]
946
+ skip = frame_info.nil?
947
+ unless skip
948
+ now = frame_info[:capturedAt]
949
+ frame = [frame_info[:filename]]
950
+ if with_last_frame
951
+ frame << frames[i - 1][:filename]
952
+ end
953
+ result = block.call(*(frame + block_args))
954
+ end
955
+ else
956
+ # For non-HP evaluation, use the current screen image (implicit)
957
+ frame_info = nil
958
+ # TODO: We use the time of the request, rather than the time after the response, because the processing
959
+ # TODO: overhead is potentially much less. However, this could result in measurements that are under by a
960
+ # TODO: number of milliseconds. Change this to use the timestamp, when available, from the server response.
961
+ now = Time.now
962
+ result = block.call(*block_args)
963
+ end
964
+ if skip
965
+ verified_this_time = false
966
+ else
967
+ elapsed = test_case.get_time_delta(start_time, now)
968
+ found_str = now.strftime('%H:%M:%S.%N')
969
+ verified_this_time = verifies?(expected_now, result)
970
+ end
971
+ if verified_this_time
972
+ # Roi verifies, check if remaining criteria are met
973
+ verified_for ||= 0
974
+ last_verified ||= now
975
+ found_in_frame ||= frame_info
976
+ verified_for += test_case.get_time_delta(last_verified, now) * 1.sec
977
+ last_verified = now
978
+ verified = verified_for >= verifies_for
979
+ elsif !verified
980
+ # Roi does not verify, reset state
981
+ verified_for = nil
982
+ last_verified = nil
983
+ found_in_frame = nil
984
+ end
985
+ if verified && verified_this_time
986
+ if expected.empty?
987
+ # Roi verifies for the required duration and all transitions
988
+ msg = "Roi #{log_state} in #{elapsed} ms, Time=#{found_str}, #{info}"
989
+ if precise
990
+ # For HP measurement, save found frame
991
+ found_in_frame[:keep] = true
992
+ # Recalculate elapsed from matching frame
993
+ found_time = found_in_frame[:capturedAt]
994
+ found_i = frames.index(found_in_frame)
995
+ elapsed = test_case.get_time_delta(start_time, found_time)
996
+ found_str = found_time.strftime('%H:%M:%S.%N')
997
+ filename = found_in_frame[:filename]
998
+ msg += ", Frame=#{found_i}"
999
+ logger.roi(self, args.merge(:message => msg, :screen_image => filename))
1000
+ if report
1001
+ test_case.report_result(:start_time => start_time.to_f, :stop_time => found_time.to_f,
1002
+ :execution_metric => execution_metric)
1003
+ end
1004
+ logger.duration(elapsed)
1005
+ else
1006
+ # Log result for evaluation
1007
+ logger.roi(self, args.merge(:message => msg, :use_last_image => true))
1008
+ end
1009
+ # For measurements, the result is the time elapsed
1010
+ if type == :measure
1011
+ result = elapsed
1012
+ elsif type == :verify
1013
+ result = true
1014
+ elsif type == :frame
1015
+ result = found_i
1016
+ end
1017
+ break
1018
+ end
1019
+ expected_now = expected.shift
1020
+ else
1021
+ # Roi does not yet verify for the required duration
1022
+ quit = precise ? i >= frames.size - 1 : elapsed >= timeout
1023
+ if quit
1024
+ # Set result for failure
1025
+ if type == :measure
1026
+ result = nil
1027
+ elsif type == :verify
1028
+ result = false
1029
+ elsif type == :frame
1030
+ result = -1
1031
+ end
1032
+ break
1033
+ elsif elapsed > next_log
1034
+ # Report screenshots at intervals
1035
+ msg = "Roi not yet #{log_state} after #{elapsed.to_s} ms, #{info}, Time=#{found_str}"
1036
+ if precise
1037
+ msg += ", Frame=#{i}"
1038
+ logger.roi(self, args.merge(:message => msg, :screen_image => frame_info[:filename]))
1039
+ frame_info[:keep] = true
1040
+ else
1041
+ logger.roi(self, args.merge(:message => msg, :use_last_image => true))
1042
+ end
1043
+ next_log = elapsed + log_every
1044
+ end
1045
+ end
1046
+ sleep(@priorities[priority]) # throttle CPU, this is native sleep
1047
+ i += 1
1048
+ end
1049
+ result
1050
+ end
1051
+
1052
+ # Internal: Triggers Roi evaluation.
1053
+ def do_trigger(key, args={})
1054
+ if args[:duts].nil?
1055
+ dut.press_key(key.to_s, args.merge(:sleep_time => 0.ms))
1056
+ else
1057
+ threads = args[:duts].map do |d|
1058
+ Thread.new { d.press_key(key.to_s, args.merge(:sleep_time => 0.ms)) }
1059
+ end
1060
+ threads.each { |thr| thr.join }
1061
+ end
1062
+ end
1063
+
1064
+ end