article banner

Exercise: GUI View Hierarchy Simulation

Implement the following classes and methods, that will represent a view hierarchy in a GUI system:

  • Create an open class View with primary constructor properties: read-only id of type String and read-write isVisible of type Boolean.
  • Implement methods show and hide in the View class, that will change the isVisible property to true and false respectively.
  • Create two subclasses of View: TextView and Toggle.
  • TextView should have a constructor with parameter id and property text, that will represent the text displayed in the view. It should set superclass isVisible property to true.
  • Toggle should have a constructor with parameter id. It should set superclass isVisible property to true.
  • Toggle should have an additional property isOn, that will represent the state of the toggle. It should be initially set to false.
  • Toggle should have a method click, that will change the isOn property to the opposite state.

Example usage:

val view = View( id = "v1", isVisible = false, ) println(view.id) // v1 println(view.isVisible) // false val textView = TextView( id = "tv1", text = "Hello, World!", ) println(textView.id) // tv1 println(textView.text) // Hello, World! println(textView.isVisible) // true textView.text = "Welcome to Kotlin!" println(textView.text) // Welcome to Kotlin! textView.hide() println(textView.isVisible) // false val toggle = Toggle( id = "toggle1", ) println(toggle.id) // toggle1 println(toggle.isOn) // false toggle.click() println(toggle.isOn) // true println(toggle.isVisible) // true toggle.hide() println(toggle.isVisible) // false toggle.show() println(toggle.isVisible) // true

This problem can either be solved in the below playground or you can clone kotlin-exercises project and solve it locally. In the project, you can find code template for this exercise in essentials/classes/Gui.kt. You can find there example usage and unit tests.

Once you are done with the exercise, you can check your solution here.

Playground

import junit.framework.TestCase.assertFalse import junit.framework.TestCase.assertTrue import org.junit.Test import kotlin.test.assertEquals // TODO fun main() { val view = View( id = "v1", isVisible = false, ) println(view.id) // v1 println(view.isVisible) // false val textView = TextView( id = "tv1", text = "Hello, World!", ) println(textView.id) // tv1 println(textView.text) // Hello, World! println(textView.isVisible) // true textView.text = "Welcome to Kotlin!" println(textView.text) // Welcome to Kotlin! textView.hide() println(textView.isVisible) // false val toggle = Toggle( id = "toggle1", ) println(toggle.id) // toggle1 println(toggle.isOn) // false toggle.click() println(toggle.isOn) // true println(toggle.isVisible) // true toggle.hide() println(toggle.isVisible) // false toggle.show() println(toggle.isVisible) // true } class GuiTests { @Test fun `view show should set isVisible to true`() { val view = View("view1", false) view.show() assertTrue(view.isVisible) } @Test fun `view hide should set isVisible to false`() { val view = View("view2", true) view.hide() assertFalse(view.isVisible) } @Test fun `toggle click should toggle isOn state`() { val toggle = Toggle("toggle1") toggle.click() assertTrue(toggle.isOn) toggle.click() assertFalse(toggle.isOn) } @Test fun `text view setText should update text property`() { val textView = TextView("textView1", "Hello") textView.text = "World" assertEquals("World", textView.text) } @Test fun `toggle should inherit properties from view`() { val toggle = Toggle("toggle2") assertTrue(toggle.isVisible) toggle.hide() assertFalse(toggle.isVisible) } @Test fun `text view should inherit properties from view`() { val textView = TextView("textView2", "Hello") assertTrue(textView.isVisible) } @Test fun `toggle should start with isOn set to false`() { val toggle = Toggle("toggle3") assertFalse(toggle.isOn) } @Test fun `toggle should toggle isOn state correctly`() { val toggle = Toggle("toggle4") toggle.click() assertTrue(toggle.isOn) toggle.click() assertFalse(toggle.isOn) toggle.click() assertTrue(toggle.isOn) } @Test fun `view show and hide interactions`() { val view = View("view3", false) view.show() assertTrue(view.isVisible) view.hide() assertFalse(view.isVisible) } @Test fun `text view setText and visibility interactions`() { val textView = TextView("textView3", "Hello") textView.text = "World" assertEquals("World", textView.text) textView.hide() assertFalse(textView.isVisible) } }