mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-07-03 18:42:53 +00:00

Rather than handling right clicks within the block entity code, we now handle it within the block. Turtles now handle the nametagging behaviour themselves, rather than overriding canNameWithTag.
175 lines
6.7 KiB
Kotlin
175 lines
6.7 KiB
Kotlin
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
|
|
//
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package dan200.computercraft.gametest
|
|
|
|
import dan200.computercraft.api.lua.Coerced
|
|
import dan200.computercraft.client.gui.AbstractComputerScreen
|
|
import dan200.computercraft.core.apis.RedstoneAPI
|
|
import dan200.computercraft.core.apis.TermAPI
|
|
import dan200.computercraft.core.computer.ComputerSide
|
|
import dan200.computercraft.gametest.api.*
|
|
import dan200.computercraft.shared.ModRegistry
|
|
import dan200.computercraft.test.core.assertArrayEquals
|
|
import dan200.computercraft.test.core.computer.getApi
|
|
import net.minecraft.core.BlockPos
|
|
import net.minecraft.core.Direction
|
|
import net.minecraft.gametest.framework.GameTest
|
|
import net.minecraft.gametest.framework.GameTestHelper
|
|
import net.minecraft.world.item.ItemStack
|
|
import net.minecraft.world.item.Items
|
|
import net.minecraft.world.level.block.Blocks
|
|
import net.minecraft.world.level.block.LeverBlock
|
|
import net.minecraft.world.level.block.RedstoneLampBlock
|
|
import org.junit.jupiter.api.Assertions.assertEquals
|
|
import org.junit.jupiter.api.Assertions.assertTrue
|
|
import org.lwjgl.glfw.GLFW
|
|
import kotlin.time.Duration.Companion.milliseconds
|
|
|
|
class Computer_Test {
|
|
/**
|
|
* Ensures redstone signals do not travel through computers.
|
|
*
|
|
* @see [#548](https://github.com/cc-tweaked/CC-Tweaked/issues/548)
|
|
*/
|
|
@GameTest
|
|
fun No_through_signal(context: GameTestHelper) = context.sequence {
|
|
val lamp = BlockPos(2, 2, 4)
|
|
val lever = BlockPos(2, 2, 0)
|
|
thenExecute {
|
|
context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit")
|
|
context.modifyBlock(lever) { x -> x.setValue(LeverBlock.POWERED, true) }
|
|
}
|
|
thenIdle(3)
|
|
thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should still not be lit") }
|
|
}
|
|
|
|
/**
|
|
* Similar to the above, but with a repeater before the computer
|
|
*/
|
|
@GameTest
|
|
fun No_through_signal_reverse(context: GameTestHelper) = context.sequence {
|
|
val lamp = BlockPos(2, 2, 4)
|
|
val lever = BlockPos(2, 2, 0)
|
|
thenExecute {
|
|
context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit")
|
|
context.modifyBlock(lever) { x -> x.setValue(LeverBlock.POWERED, true) }
|
|
}
|
|
thenIdle(3)
|
|
thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should still not be lit") }
|
|
}
|
|
|
|
/**
|
|
* Check computers propagate redstone to surrounding blocks.
|
|
*/
|
|
@GameTest
|
|
fun Set_and_destroy(context: GameTestHelper) = context.sequence {
|
|
val lamp = BlockPos(2, 2, 3)
|
|
|
|
thenOnComputer { getApi<RedstoneAPI>().setOutput(ComputerSide.BACK, true) }
|
|
thenIdle(3)
|
|
thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, true, "Lamp should be lit") }
|
|
thenExecute { context.setBlock(BlockPos(2, 2, 2), Blocks.AIR) }
|
|
thenIdle(4)
|
|
thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit") }
|
|
}
|
|
|
|
/**
|
|
* Check computers pick up propagated redstone to surrounding blocks.
|
|
*
|
|
* @see [#1520](https://github.com/cc-tweaked/CC-Tweaked/issues/1520)
|
|
*/
|
|
@GameTest
|
|
fun Self_output_update(context: GameTestHelper) = context.sequence {
|
|
thenOnComputer {
|
|
getApi<RedstoneAPI>().setOutput(ComputerSide.BACK, true)
|
|
sleep(100.milliseconds)
|
|
assertEquals(true, getApi<RedstoneAPI>().getInput(ComputerSide.BACK), "Input should be on")
|
|
|
|
getApi<RedstoneAPI>().setOutput(ComputerSide.BACK, false)
|
|
sleep(100.milliseconds)
|
|
assertEquals(false, getApi<RedstoneAPI>().getInput(ComputerSide.BACK), "Input should be off")
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check computers and turtles expose peripherals.
|
|
*/
|
|
@GameTest
|
|
fun Computer_peripheral(context: GameTestHelper) = context.sequence {
|
|
thenExecute {
|
|
context.assertPeripheral(BlockPos(3, 2, 2), type = "computer")
|
|
context.assertPeripheral(BlockPos(1, 2, 2), type = "turtle")
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check chest peripherals are reattached with a new size.
|
|
*/
|
|
@GameTest
|
|
fun Chest_resizes_on_change(context: GameTestHelper) = context.sequence {
|
|
thenOnComputer { callPeripheral("right", "size").assertArrayEquals(27) }
|
|
thenExecute { context.placeItemAt(ItemStack(Items.CHEST), BlockPos(2, 2, 2), Direction.WEST) }
|
|
thenIdle(1)
|
|
thenOnComputer { callPeripheral("right", "size").assertArrayEquals(54) }
|
|
}
|
|
|
|
/**
|
|
* Check the client can open the computer UI and interact with it.
|
|
*/
|
|
@ClientGameTest
|
|
fun Open_on_client(context: GameTestHelper) = context.sequence {
|
|
// Write "Hello, world!" and then print each event to the terminal.
|
|
thenOnComputer { getApi<TermAPI>().write(Coerced("Hello, world!")) }
|
|
thenStartComputer {
|
|
val term = getApi<TermAPI>().terminal
|
|
while (true) {
|
|
val event = pullEvent()
|
|
if (term.cursorY >= term.height) {
|
|
term.scroll(1)
|
|
term.setCursorPos(0, term.height)
|
|
} else {
|
|
term.setCursorPos(0, term.cursorY + 1)
|
|
}
|
|
|
|
term.write(event.contentToString())
|
|
}
|
|
}
|
|
// Teleport the player to the computer and then open it.
|
|
thenExecute {
|
|
context.positionAt(BlockPos(2, 2, 1))
|
|
context.useBlock(BlockPos(2, 2, 2), context.level.randomPlayer!!)
|
|
}
|
|
// Assert the terminal is synced to the client.
|
|
thenIdle(2)
|
|
thenOnClient {
|
|
val menu = getOpenMenu(ModRegistry.Menus.COMPUTER.get())
|
|
val term = menu.terminal
|
|
assertEquals("Hello, world!", term.getLine(0).toString().trim(), "Terminal contents is synced")
|
|
assertTrue(menu.isOn, "Computer is on")
|
|
}
|
|
// Press a key on the client
|
|
thenOnClient {
|
|
val screen = minecraft.screen as AbstractComputerScreen<*>
|
|
screen.keyPressed(GLFW.GLFW_KEY_A, 0, 0)
|
|
screen.keyReleased(GLFW.GLFW_KEY_A, 0, 0)
|
|
}
|
|
// And assert it is handled and sent back to the client
|
|
thenIdle(2)
|
|
thenOnClient {
|
|
val term = getOpenMenu(ModRegistry.Menus.COMPUTER.get()).terminal
|
|
assertEquals(
|
|
"[key, ${GLFW.GLFW_KEY_A}, false]",
|
|
term.getLine(1).toString().trim(),
|
|
"Terminal contents is synced",
|
|
)
|
|
assertEquals(
|
|
"[key_up, ${GLFW.GLFW_KEY_A}]",
|
|
term.getLine(2).toString().trim(),
|
|
"Terminal contents is synced",
|
|
)
|
|
}
|
|
}
|
|
}
|