# Compilación, pruebas y estado

## Estado actual

- **Sunfish 3 en diseño:** solo hay documentación (`DOC/`, `AGENTS.md`, `README.md`).
- El código de la 2.0 sigue en el repositorio y **no** es la base de la 3: se reescribe desde
  cero ([LEGACY-2.0.md](LEGACY-2.0.md)).
- Rama actual `master` en un remoto privado. El README ya da las instrucciones para GitHub
  (rama `main`), para cuando se publique allí.

## Publicación prevista

| Proyecto | Salida | Propiedades |
|---|---|---|
| `Sunfish.Core` | biblioteca | `IsAotCompatible`, `TreatWarningsAsErrors` para avisos de AOT/trimming |
| `Sunfish.Cli` | `sunfish-cli` / `sunfish-cli.exe` | `PublishAot`, `InvariantGlobalization`, `StripSymbols` |
| `Sunfish.WinForms` | `Sunfish.exe` | `OutputType=WinExe`, `UseWindowsForms`, `PublishSingleFile`, `IncludeNativeLibrariesForSelfExtract`; autocontenido + `EnableCompressionInSingleFile` o dependiente del framework (pendiente, ver [ARQUITECTURA.md](ARQUITECTURA.md#publicación)) |

- .NET 10. RID: `win-x64`, `win-arm64`, `linux-x64`, `linux-arm64`, `osx-x64`, `osx-arm64`.
- Native AOT no compila de forma cruzada entre sistemas: cada `sunfish-cli` se compila en su
  sistema.

## Requisitos

- git y el SDK de .NET 10.
- Para `sunfish-cli` (AOT):
  - Windows: Visual Studio Build Tools con «Desarrollo para escritorio con C++».
  - Linux: `clang`, `ld` y las cabeceras de zlib.
  - macOS: Xcode Command Line Tools.
- Para `Sunfish.exe`: solo el SDK.

## Scripts previstos

| Script | Función |
|---|---|
| `build.ps1` | Windows. Detecta el RID, comprueba requisitos (no instala nada; da el comando), usa el repo actual o clona/actualiza, publica `Sunfish.exe` y `sunfish-cli.exe`, los deja en la raíz y explica cómo poner `sunfish-cli` en el `PATH`. **Pendiente:** si faltan las herramientas de C++, ¿falla o compila solo la GUI? |
| `build.sh` | Linux y macOS. Lo mismo para `sunfish-cli` (sugerencias para apt, dnf, pacman y brew) |
| `run.cmd` | `dotnet run` de `Sunfish.WinForms`, para doble clic |
| `run-cli.cmd` | `dotnet run` de `Sunfish.Cli`, para doble clic |
| `run.sh` | `dotnet run` de `Sunfish.Cli` en Linux y macOS |

- Variable para forks: `SUNFISH_REPO_URL`.
- Sin script `publish` aparte: `build.*` ya publica.
- `.gitignore`: `/Sunfish.exe`, `/sunfish-cli`, `/sunfish-cli.exe`, `/sunfish.conf`, `publish/`.

## Comandos previstos

```
dotnet build
dotnet test
dotnet run --project src/Sunfish.WinForms
dotnet run --project src/Sunfish.Cli -- [argumentos]
dotnet publish src/Sunfish.Cli -c Release -r <RID>
dotnet publish src/Sunfish.WinForms -c Release -r win-x64
```

## Pruebas automáticas previstas (`tests/Sunfish.Tests`)

xUnit sobre `net10.0`, con `InternalsVisibleTo` desde `Sunfish.Core`. Las pruebas que tocan
variables de entorno van en una colección sin paralelismo. Las de servidor arrancan
`SunfishHost` en `localhost` con puertos libres y hablan con él por sockets.

| Área | Qué se prueba |
|---|---|
| HTTP | HTTP/0.9, 1.0 sin `Host`, `LF` solo, cabeceras raras, límites, keep-alive, `chunked`, `Range`, 304, `HEAD` |
| Multipart | Límites partidos entre búferes, varios ficheros, nombres con ruta de Windows o de Mac, subida cortada (no deja restos) |
| Locations | Prefijo más largo, comparación por segmentos, ocultación, directorios virtuales, raíz con y sin menú, `/$sunfish` |
| Rutas | `..`, `%2e%2e`, `\`, `:`, nombres reservados, enlaces que salen del share (con ramas por SO) |
| Permisos | Matriz operación × opción de share × web/FTP/WebDAV; usuarios |
| HTML | Escapado, entidades Latin-1, enlaces `%XX` en UTF-8, modo clásico sin `<script>` |
| CSRF / Auth | *Tokens* válidos, caducados y de otra ruta; PBKDF2; caché; bloqueo por intentos |
| FTP | Comandos, `LIST` en formato `ls -l`, `MLSD`, `PASV`/`EPSV`, `PORT` hacia otra IP rechazado, `REST`, `TYPE A`, juegos de caracteres |
| WebDAV | `PROPFIND` 0/1, `infinity` rechazado, `MKCOL`, `MOVE`/`COPY`, `LOCK` simulado, XML con DTD rechazado |
| Mac | Ver [MAC-CLASICO.md](MAC-CLASICO.md#pruebas-previstas) |
| ZIP | Lo generado se lee con `System.IO.Compression`; Stored y Deflate; nombres CP437/UTF-8 |
| Config | Lectura, escritura conservando comentarios, errores con línea, importación de `sunfish2` |
| QR | Matrices frente a vectores de referencia |

## Pruebas manuales previstas

- **Navegadores modernos:** web clásica y moderna, arrastrar y soltar, subida grande por trozos.
- **Windows 95/98** con sus navegadores de la época: listado, descargas, subidas por formulario,
  ZIP; `ftp.exe` en modo activo; Carpetas web (WebDAV).
- **Mac clásico (System 6/7, Mac OS 8/9)** con navegadores y clientes FTP de la época: listado,
  descargas `.bin`/`.hqx`, subidas MacBinary/BinHex, nombres con acentos.
- **WebDAV moderno:** Explorador de Windows, Finder de macOS, GVfs.
- **GUI:** doble clic, arrastrar carpeta a la lista y sobre el `.exe`, bandeja, instancia única.
- **TUI** en Windows Terminal, conhost, Linux, macOS y por SSH.
- `build.ps1` con `| iex`; `build.sh` en Linux y macOS.
