# 🛰️ Mars Rover

![Build](https://github.com/appsoluut/dojo-mars-rover/actions/workflows/ci.yml/badge.svg) [![codecov](https://codecov.io/gh/appsoluut/dojo-mars-rover/branch/main/graph/badge.svg)](https://codecov.io/gh/appsoluut/dojo-mars-rover) [![DeepSource](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover.svg/?label=code+coverage&show_trend=true&token=UmCazOJ6A2-UkVOMKafStlYo)](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover/) [![DeepSource](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover.svg/?label=active+issues&show_trend=true&token=UmCazOJ6A2-UkVOMKafStlYo)](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover/) [![DeepSource](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover.svg/?label=resolved+issues&show_trend=true&token=UmCazOJ6A2-UkVOMKafStlYo)](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover/)

## 🚀 Features

- 🔧 Gradle wrapper included
- 🧹 Ktlint & Detekt code quality checks
- 🧪 Unit testing with JUnit
- 📊 Code coverage via JaCoCo
- 🤖 CI/CD with GitHub Actions
- ☁️ Codecov integration
- ☁️ DeepSource integration

## 🧰 Setup

```bash
# Clone and enter project
git clone https://github.com/appsoluut/dojo-mars-rover
cd Rover

# Build and test
./gradlew build test

# Run Detekt and Ktlint checks
./gradlew detekt ktlintCheck
```

## Problem

NASA is landing a robotic rover on a rectangular plateau on Mars.  
This plateau must be explored systematically so that the rover’s on-board cameras can survey the terrain and send images back to Earth.

A rover’s position is represented by:
- Two integers (**X**, **Y**) indicating its coordinates, and
- A letter indicating its current heading:
    - **N** (North)
    - **E** (East)
    - **S** (South)
    - **W** (West)

The plateau is divided into a grid, and the rover moves across it based on simple navigation commands.

For example, a position of `0 0 N` means the rover is at the bottom-left corner, facing North.

---

## Instructions

NASA can send the following commands to the rover:

- `L` ➔ Turn 90 degrees **left** without moving from the current spot.
- `R` ➔ Turn 90 degrees **right** without moving from the current spot.
- `M` ➔ Move **forward** one grid point in the direction it is facing.

> **Important**:  
> Moving North from `(x, y)` goes to `(x, y+1)`.  
> Moving East from `(x, y)` goes to `(x+1, y)`, and so on.

---

## Input

The input consists of:

1. **First parameter**: The rover’s **starting position**: two integers and a letter (e.g., `1 2 N`).

2. **Second parameter**: A string of **movement instructions** (e.g., `LMLMLMLMM`).

The rover processes all instructions in sequence.

---

## Output

After executing all the commands, the rover reports its **final coordinates and heading**.

---

## Example

| Starting Position | Instructions | Expected Output |
|:------------------|:-------------|:----------------|
| 1 2 N             |               | 1 2 N           |
| 1 2 N             | L             | 1 2 W           |
| 1 2 W             | L             | 1 2 S           |
| 1 2 S             | L             | 1 2 E           |
| 1 2 E             | L             | 1 2 N           |
| 1 2 N             | R             | 1 2 E           |
| 1 2 E             | R             | 1 2 S           |
| 1 2 S             | R             | 1 2 W           |
| 1 2 W             | R             | 1 2 N           |
| 1 2 N             | M             | 1 3 N           |
| 1 2 E             | M             | 2 2 E           |
| 1 2 S             | M             | 1 1 S           |
| 1 2 W             | M             | 0 2 W           |
| 1 2 N             | LMLMLMLMM     | 1 3 N           |
| 3 3 E             | MMRMMRMRRM    | 5 1 E           |

---

# 🎯 Your Mission

You have been given a **working but fragile** codebase that controls a **single** rover.

Your goal:
- **Refactor** the code to make it clean, expressive, and easy to maintain.
- Prepare the code for **future enhancements**.
- Eliminate technical debt, improve readability, and structure it to allow **easily adding new features** later.

> 🧠 **Hint**:  
> Future missions may require **handling multiple rovers** at once.  
> Your design should naturally evolve toward making this possible.

✅ **Do not change the existing behavior.**  
✅ **All existing tests must continue to pass.**

---

# 🌟 Good luck, engineer of Mars!
Craft code that's ready for exploration... and evolution! 🚀
