package Ġorg . opp ia . app . player . audio Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . net . Uri Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroidx . test . core . app . Activity Scenario Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . espress o . Esp ress o . on View Ċ import Ġandroidx . test . espress o . View Action Ċ import Ġandroidx . test . espress o . action . Coordinates Provider Ċ import Ġandroidx . test . espress o . action . General Click Action Ċ import Ġandroidx . test . espress o . action . Press Ċ import Ġandroidx . test . espress o . action . Tap Ċ import Ġandroidx . test . espress o . action . View Actions . click Ċ import Ġandroidx . test . espress o . assertion . View Assertions . matches Ċ import Ġandroidx . test . espress o . matcher . Root Matchers . is Dialog Ċ import Ġandroidx . test . espress o . matcher . View Matchers . is Displayed Ċ import Ġandroidx . test . espress o . matcher . View Matchers . with Content Description Ċ import Ġandroidx . test . espress o . matcher . View Matchers . with Id Ċ import Ġandroidx . test . espress o . matcher . View Matchers . with Text Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġdagger . Bind s Instance Ċ import Ġdagger . Component Ċ import Ġdagger . Module Ċ import Ġdagger . Provides Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġorg . hamcrest . Description Ċ import Ġorg . hamcrest . Type Safe Matcher Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Ignore Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . opp ia . app . R Ċ import Ġorg . opp ia . app . testing . Audio Fragment Test Activity Ċ import Ġorg . opp ia . domain . audio . Audio Player Controller Ċ import Ġorg . opp ia . util . caching . Cache Assets Loc ally Ċ import Ġorg . opp ia . util . logging . Enable Console Log Ċ import Ġorg . opp ia . util . logging . Enable File Log Ċ import Ġorg . opp ia . util . logging . Global LogLevel Ċ import Ġorg . opp ia . util . logging . LogLevel Ċ import Ġorg . opp ia . util . threading . Background Dispatcher Ċ import Ġorg . opp ia . util . threading . Blocking Dispatcher Ċ import Ġjava . util . Locale Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Qualifier Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* ĠTODO (# 5 9 ): ĠMake Ġthis Ġtest Ġwork Ġwith ĠE sp ress o . Ċ Ġ* ĠNOTE ĠTO ĠDE VELO PER S : ĠThis Ġtest Ġwill Ġnot Ġbuild Ġfor ĠE sp ress o , Ċ Ġ* Ġand Ġmay Ġprevent Ġother Ġtests Ġfrom Ġbeing Ġbuilt Ġor Ġrunning . Ċ Ġ* ĠTests Ġfor Ġ[ Audio Fragment ]. Ċ Ġ*/ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠAudio Fragment Test Ġ{ ĊĊĠ Ġ@ Inject Ġlateinit Ġvar Ġcontext : ĠContext ĊĊĠ Ġprivate Ġlateinit Ġvar Ġactivity Scenario : ĠActivity Scenario < Audio Fragment Test Activity > ĊĊĠ Ġ@ Inject Ġlateinit Ġvar Ġaudio Player Controller : ĠAudio Player Controller ĊĠ Ġprivate Ġlateinit Ġvar Ġshadow MediaPlayer : ĠAny ĊĊĠ Ġprivate Ġval ĠTEST _ URL Ġ= Ġ" https :// storage . googleapis . com / op pi aser ver - resources / ex ploration / 2 m zz FV DL u Aj 8 / assets / audio / content - en - 0 5 7 j 5 1 i 2 es . mp 3 " ĊĠ Ġprivate Ġval ĠTEST _ URL 2 Ġ= Ġ" https :// storage . googleapis . com / op pi aser ver - resources / ex ploration / 2 m zz FV DL u Aj 8 / assets / audio / content - es - i 0 n hu 4 9 z 0 q . mp 3 " ĊĊĠ Ġ@ Before ĊĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠ ĠsetUp Test Application Component () ĊĠĠĠ Ġadd Media Info () ĊĠĠĠ Ġshadow MediaPlayer Ġ= Ġshadow Of ( audio Player Controller . getTest MediaPlayer ()) ĊĠĠĠ Ġset DataSource ( shadow MediaPlayer , Ġto DataSource ( context , ĠUri . parse ( TEST _ URL ))) ĊĠĠĠ Ġactivity Scenario Ġ= ĠActivity Scenario . launch ( Audio Fragment Test Activity :: class . java ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Audio Fragment _ open Fragment _ shows Fragment () Ġ{ ĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( is Displayed ())) ĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( with Content Description ( context . getString ( R . string . audio _ play _ description )))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Audio Fragment _ invoke Prepared _ click Play Button _ shows Pause Button () Ġ{ ĊĠĠĠ Ġinvoke Prepared Listener ( shadow MediaPlayer ) ĊĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). perform ( click ()) ĊĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( with Content Description ( context . getString ( R . string . audio _ pause _ description )))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Audio Fragment _ invoke Prepared _ touch Seek Bar _ check Still Paused () Ġ{ ĊĠĠĠ Ġinvoke Prepared Listener ( shadow MediaPlayer ) ĊĊĠĠĠ Ġon View ( with Id ( R . id . sb Audio Progress )). perform ( click Seek Bar ( 1 0 0 )) ĊĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( with Content Description ( context . getString ( R . string . audio _ play _ description )))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Audio Fragment _ invoke Prepared _ click Play _ touch Seek Bar _ check Still Playing () Ġ{ ĊĠĠĠ Ġinvoke Prepared Listener ( shadow MediaPlayer ) ĊĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). perform ( click ()) ĊĠĠĠ Ġon View ( with Id ( R . id . sb Audio Progress )). perform ( click Seek Bar ( 1 0 0 )) ĊĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( with Content Description ( context . getString ( R . string . audio _ pause _ description )))) ĊĠ Ġ} ĊĊĊĠ Ġ@ Test ĊĠ Ġ@ Ignore (" Land scape Ġnot Ġproperly Ġsupported ") Ġ// ĠTODO (# 5 6 ): ĠRe enable Ġonce Ġlandscape Ġis Ġsupported . ĊĠ Ġfun Ġtest Audio Fragment _ invoke Prepared _ play Audio _ configuration Change _ check Still Playing () Ġ{ ĊĠĠĠ Ġinvoke Prepared Listener ( shadow MediaPlayer ) ĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). perform ( click ()) ĊĠĠĠ Ġon View ( with Id ( R . id . sb Audio Progress )). perform ( click Seek Bar ( 1 0 0 )) ĊĠĠĠ Ġactivity Scenario . on Activity Ġ{ Ġactivity Ġ-> ĊĠĠĠĠĠ Ġactivity . requested Orientation Ġ= ĠConfiguration . OR IENTATION _ LAND SC APE ĊĠĠĠ Ġ} ĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( with Content Description ( context . getString ( R . string . audio _ pause _ description )))) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Audio Fragment _ invoke Prepared _ change Different Language _ check Reset Seek Bar And Paused () Ġ{ ĊĠĠĠ Ġinvoke Prepared Listener ( shadow MediaPlayer ) ĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). perform ( click ()) ĊĠĠĠ Ġon View ( with Id ( R . id . sb Audio Progress )). perform ( click Seek Bar ( 1 0 0 )) ĊĊĠĠĠ Ġon View ( with Id ( R . id . tv Audio Language )). perform ( click ()) ĊĠĠĠ Ġval Ġlocale Ġ= ĠLocale (" es ") ĊĠĠĠ Ġon View ( with Text ( locale . getDisplay Language ( locale ))). in Root ( is Dialog ()). perform ( click ()) ĊĠĠĠ Ġon View ( with Text (" OK ")). in Root ( is Dialog ()). perform ( click ()) ĊĊĠĠĠ Ġon View ( with Id ( R . id . iv Play Pause Audio )). check ( matches ( with Content Description ( context . getString ( R . string . audio _ play _ description )))) ĊĠĠĠ Ġon View ( with Id ( R . id . sb Audio Progress )). check ( matches ( with Seek Bar Position ( 0 ))) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwith Seek Bar Position ( position : ĠInt ) Ġ= Ġobject Ġ: ĠType Safe Matcher < View >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdescribe To ( description : ĠDescription ) Ġ{ ĊĠĠĠĠĠ Ġdescription . append Text (" Seek Bar Ġwith Ġprogress Ġsame Ġas Ġ$ position ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmatches S af ely ( view : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġview Ġis ĠSeek Bar Ġ&& Ġview . progress Ġ== Ġposition ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclick Seek Bar ( position : ĠInt ): ĠView Action Ġ{ ĊĠĠĠ Ġreturn ĠGeneral Click Action ( Tap . SINGLE , Ġobject : ĠCoordinates Provider Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġcalculate Coordinates ( view : ĠView ?): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseek Bar Ġ= Ġview Ġas ĠSeek Bar ĊĠĠĠĠĠĠĠ Ġval Ġscreen Pos Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġseek Bar . getLocation In Window ( screen Pos ) ĊĠĠĠĠĠĠĠ Ġval Ġtrue With Ġ= Ġseek Bar . width Ġ- Ġseek Bar . padding Left Ġ- Ġseek Bar . padding Right ĊĊĠĠĠĠĠĠĠ Ġval Ġpercentage Pos Ġ= Ġ( position . toFloat () Ġ/ Ġseek Bar . max ) ĊĠĠĠĠĠĠĠ Ġval Ġscreen X Ġ= Ġtrue With Ġ* Ġpercentage Pos Ġ+ Ġscreen Pos [ 0 ] Ġ+ Ġseek Bar . padding Left ĊĠĠĠĠĠĠĠ Ġval Ġscreen Y Ġ= Ġseek Bar . height / 2 f Ġ+ Ġscreen Pos [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġcoordinates Ġ= ĠFloat Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġcoordinates [ 0 ] Ġ= Ġscreen X ĊĠĠĠĠĠĠĠ Ġcoordinates [ 1 ] Ġ= Ġscreen Y ĊĠĠĠĠĠĠĠ Ġreturn Ġcoordinates ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĠPress . F ING ER , Ġ/* Ġinput Device = Ġ*/ Ġ 0 , Ġ/* Ġdevice State = Ġ*/ Ġ 0 ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠsetUp Test Application Component () Ġ{ ĊĠĠĠ ĠD agger Audio Fragment Test _ Test Application Component . builder () ĊĠĠĠĠĠ Ġ. set Application ( Application Provider . getApplicationContext ()) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġ. inject ( this ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadd Media Info () Ġ{ ĊĠĠĠ Ġval ĠdataSource Ġ= Ġto DataSource ( context Ġ, ĠUri . parse ( TEST _ URL )) ĊĠĠĠ Ġval ĠdataSource 2 Ġ= Ġto DataSource ( context Ġ, ĠUri . parse ( TEST _ URL 2 )) ĊĠĠĠ Ġval Ġmedia Info Ġ= Ġcreate Media Info (/* Ġduration = Ġ*/ Ġ 1 0 0 0 , /* Ġpreparation Delay = Ġ*/ Ġ 0 ) ĊĠĠĠ Ġadd Media Info ( dataSource , Ġmedia Info ) ĊĠĠĠ Ġadd Media Info ( dataSource 2 , Ġmedia Info ) ĊĠ Ġ} ĊĊĠ Ġ// ĠTODO (# 5 9 ): ĠReplace Ġthe Ġreflection Ġcode Ġbelow Ġwith Ġdirect Ġcalls Ġto ĠRo bo lectric Ġonce Ġthis Ġtest Ġcan Ġbe Ġmade Ġto Ġrun ĊĠ Ġ// Ġ Ġonly Ġon ĠRo bo lectric Ġ( or Ġproperly Ġon ĠE sp ress o Ġwithout Ġrelying Ġon ĠRo bo lectric Ġshadow s , Ġe . g . Ġby Ġusing Ġcompile - time ĊĠ Ġ// Ġ Ġreplace able Ġf akes ). ĊĊĠ Ġ// ĠNOTE ĠTO ĠDE VELO PER S : ĠDO ĠNOT ĠREPL ICATE ĠTHE ĠREF LECTION ĠCODE ĠBE LOW ĠANY WHERE . ĠTHIS ĠIS ĠA ĠSTOP - GAP ĠME AS URE ĠU NT IL ĠWE ĠCAN ĊĠ Ġ// ĠUSE ĠB AZ EL ĠTO ĠPROPER LY ĠBUILD ĠTHIS ĠTEST ĠSPEC IFIC ALLY ĠFOR ĠRO BO LECT RIC ĠAND ĠNOT ĠFOR ĠESP RESS O . ĊĊĠ Ġ/** ĠCalls ĠRo bo lectric 's ĠShadow s . shadow Of () Ġusing Ġreflection . Ġ*/ ĊĠ Ġprivate Ġfun Ġshadow Of ( media Player : ĠMedia Player ): ĠAny Ġ{ ĊĠĠĠ Ġval Ġshadow s Class Ġ= ĠClass . forName (" org . ro bo lectric . Shadow s ") ĊĠĠĠ Ġreturn Ġshadow s Class . getMethod (" shadow Of ", ĠMedia Player :: class . java ). invoke (/* Ġobj = Ġ*/ Ġnull , Ġmedia Player ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠCalls ĠShadow MediaPlayer . set DataSource () Ġusing Ġreflection . Ġ*/ ĊĠ Ġprivate Ġfun Ġset DataSource ( shadow MediaPlayer : ĠAny , ĠdataSource : ĠAny ) Ġ{ ĊĠĠĠ Ġval ĠdataSource Class Ġ= ĠClass . forName (" org . ro bo lectric . shadow s . util . DataSource ") ĊĠĠĠ Ġshadow MediaPlayer . java Class . getMethod (" set DataSource ", ĠdataSource Class ). invoke ( shadow MediaPlayer , ĠdataSource ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠCalls ĠShadow MediaPlayer . invoke Prepared Listener () Ġusing Ġreflection . Ġ*/ ĊĠ Ġprivate Ġfun Ġinvoke Prepared Listener ( shadow MediaPlayer : ĠAny ) Ġ{ ĊĠĠĠ Ġshadow MediaPlayer . java Class . getMethod (" invoke Prepared Listener "). invoke ( shadow MediaPlayer ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġa Ġnew ĠShadow MediaPlayer . Media Info Ġusing Ġreflection . Ġ*/ ĊĠ Ġprivate Ġfun Ġcreate Media Info ( duration : ĠInt , Ġpreparation Delay : ĠInt ): ĠAny Ġ{ ĊĠĠĠ Ġval Ġmedia Info Class Ġ= ĠClass . forName (" org . ro bo lectric . shadow s . Shadow MediaPlayer \$ Media Info ") ĊĠĠĠ Ġreturn Ġmedia Info Class . get Constructor ( Int :: class . java , ĠInt :: class . java ). newInstance ( duration , Ġpreparation Delay ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠCalls ĠShadow MediaPlayer . add Media Info () Ġusing Ġreflection . Ġ*/ ĊĠ Ġprivate Ġfun Ġadd Media Info ( dataSource : ĠAny , Ġmedia Info : ĠAny ) Ġ{ ĊĠĠĠ Ġval Ġshadow MediaPlayer Class Ġ= ĠClass . forName (" org . ro bo lectric . shadow s . Shadow MediaPlayer ") ĊĠĠĠ Ġval ĠdataSource Class Ġ= ĠClass . forName (" org . ro bo lectric . shadow s . util . DataSource ") ĊĠĠĠ Ġval Ġmedia Info Class Ġ= ĠClass . forName (" org . ro bo lectric . shadow s . Shadow MediaPlayer \$ Media Info ") ĊĠĠĠ Ġval Ġadd Media Info Method Ġ= Ġshadow MediaPlayer Class . getMethod (" add Media Info ", ĠdataSource Class , Ġmedia Info Class ) ĊĠĠĠ Ġadd Media Info Method . invoke (/* Ġobj = Ġ*/ Ġnull , ĠdataSource , Ġmedia Info ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠCalls ĠDataSource . to DataSource () Ġusing Ġreflection . Ġ*/ ĊĠ Ġprivate Ġfun Ġto DataSource ( context : ĠContext , Ġuri : ĠUri ): ĠAny Ġ{ ĊĠĠĠ Ġval ĠdataSource Class Ġ= ĠClass . forName (" org . ro bo lectric . shadow s . util . DataSource ") ĊĠĠĠ Ġval Ġto DataSource Method Ġ= ĠdataSource Class . getMethod (" to DataSource ", ĠContext :: class . java , ĠUri :: class . java ) ĊĠĠĠ Ġreturn Ġto DataSource Method . invoke (/* Ġobj = Ġ*/ Ġnull , Ġcontext , Ġuri ) ĊĠ Ġ} ĊĊĠ Ġ@ Qualifier ĊĠ Ġannotation Ġclass ĠTest Dispatcher ĊĊĠ Ġ// ĠTODO (# 8 9 ): ĠMove Ġthis Ġto Ġa Ġcommon Ġtest Ġapplication Ġcomponent . ĊĠ Ġ@ Module ĊĠ Ġclass ĠTest Module Ġ{ ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġfun Ġprovide Context ( application : ĠApplication ): ĠContext Ġ{ ĊĠĠĠĠĠ Ġreturn Ġapplication ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Test Dispatcher ĊĠĠĠ Ġfun Ġprovide Test Dispatcher (): ĠCor outine Dispatcher Ġ{ ĊĠĠĠĠĠ Ġreturn ĠTest Coroutine Dispatcher () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Background Dispatcher ĊĠĠĠ Ġfun Ġprovide Background Dispatcher (@ Test Dispatcher Ġtest Dispatcher : ĠCor outine Dispatcher ): ĠCor outine Dispatcher Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtest Dispatcher ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Singleton ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Blocking Dispatcher ĊĠĠĠ Ġfun Ġprovide Blocking Dispatcher (@ Test Dispatcher Ġtest Dispatcher : ĠCor outine Dispatcher ): ĠCor outine Dispatcher Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtest Dispatcher ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO (# 5 9 ): ĠEither Ġisolate Ġthese Ġto Ġtheir Ġown Ġshared Ġtest Ġmodule , Ġor Ġuse Ġthe Ġreal Ġlogging ĊĠĠĠ Ġ// Ġmodule Ġin Ġtests Ġto Ġavoid Ġneeding Ġto Ġspecify Ġthese Ġsettings Ġfor Ġtests . ĊĠĠĠ Ġ@ Enable Console Log ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide Enable Console Log (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Enable File Log ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide Enable File Log (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Global LogLevel ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide Global LogLevel (): ĠLogLevel Ġ= ĠLogLevel . VERBOSE ĊĊĠĠĠ Ġ@ Cache Assets Loc ally ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide Cache Assets Loc ally (): ĠBoolean Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġ@ Singleton ĊĠ Ġ@ Component ( modules Ġ= Ġ[ Test Module :: class ]) ĊĠ Ġinterface ĠTest Application Component Ġ{ ĊĠĠĠ Ġ@ Component . Builder ĊĠĠĠ Ġinterface ĠBuilder Ġ{ ĊĠĠĠĠĠ Ġ@ Bind s Instance ĊĠĠĠĠĠ Ġfun Ġset Application ( application : ĠApplication ): ĠBuilder ĊĠĠĠĠĠ Ġfun Ġbuild (): ĠTest Application Component ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġinject ( audio Fragment Test : ĠAudio Fragment Test ) ĊĠ Ġ} Ċ } Ċ