class GoogleAnalytics { func sentEvent(key) } ``` kotlin interface EventService() { fun logEvent(name: String, properties: Map<String, String>? = null) } class GoogleAnalytics( val gaClient: GAClient, ) : EventService() { fun init() { initialize() } fun initialize() { // set uer id // set .... } fun logEvent(name: String, properties: Map<String, String>? = null) { gaClient.logEvnet(name, properties) } } class MixPanel( val client: mixPanelClient ) : EventService() { fun logEvent(name: String, properties: Map<String, String>? = null) { client.logEvnet(name, properties) } } class EvnetManager( val eventServies: List<EventService>() ) { fun logEvent(name: String, properties: Map<String, String>? = null) { eventServies.forEach { it.logEvent(name, properties) } } } class Application { fun init() { val eventPlanAManager = EventManager( list( GAClient(), ) ) val eventPlanBManager = EventManager( list( MixPanelClient(), ) ) val testingSession = getSession() val eventManager = when(session) { "A" -> else -> } } fun getEventManager() { return when(session) { "A" -> eventPlanAManager else -> eventPlanBManager } } } class MainPage() { val eventManager = eventPlanAManager() init() { eventManager.logEvent("viewLoaded") } } class LoginPage() { val eventManager = eventPlanBManager() init() { eventManager.logEvent("viewLoaded") } } @Test class SesstionEventManagerTest { val eventPlanAManager by mock<EventManger>() val eventPlanBManager by mock<EventManger>() val sessionManager by moch<SessionManager>() @Test fun `test session a use event manager plan a` { whenevent(sessionManager.getSession).thenReturn("A") val target = App.getEventManager() eventPlanAManager.logEvent("").assertInvoke() eventPlanBManager.logEvent("").assertNotInvoke() } @Test fun `test session b use event manager plan B` { whenevent(sessionManager.getSession).thenReturn("B") val target = App.getEventManager() eventPlanAManager.logEvent("").assertInvoke() eventPlanBManager.logEvent("").assertNotInvoke() } @Test fun `test main page log view loaded event` { val eventManager = mock<EventManager> val target = MainPage( eventManager ) target.init() eventManager.logEvent("viewLoaded").assertInvoke() } } ``` ```swift // ex. "aab" => "aba" yes // ex. "abc" => "abc" no // ABCCBADDEWR // h // t class Sol { func isPalidrome(String s) -> String? { var charCounted: [Character: Int] = getCharCounted(s) guard isCanArrangeToPalindrome(charCounted) else { return nil } return buildPalindrome(charCounted) // 1. Put all char to Map var table = [String: Int]() s.foreach { // table[$0, default: 0] += 1 if let char = table[s] { table[s] += 1 } else { table[s] = 1 } } let oddChars = table.filter { $0.count % 2 == 1 } guard oddChars > 1 else { return nil } var oddCount = 0 var oddChar = 0 // 2 table.keys.foreach { if table[$0] % 2 != 0 { // odd oddCount += 1 oddChar = $0 } } // aa, aba, if oddCount > 1 && (s.length / 2) == 0 { return nil } // bbaaabb let centerString = oddChars.join() return table.fiter($0.count % 2 == 1).reduce(cneterString) { result, next in let count = next.element let char = next.key let appendStr = Array(repeating: char, count/2) return "\(appendStr)\(result)\(appendStr)" } // aaabaaa var head = "" var tail = "" table.keys.foreach { if let count = table[$0], count != 1 { for (var i = 0; i < count / 2; i++){ head += $0 tail += $0 } } } return oddCount == 1 ? head + oddChar + tail : head + tail } } ```