Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-mcp

Model Context Protocol server for Pudu language documentation and compiler tools

0.1.1Apache-2.01

InstallClose

PaginationTest.pudu

Pudu44 lines2.7 KB

GitHub ↗
1/** @Test.Domain.Protocol.PaginationTest.Suite — cursors over list results */2module PuduLangMcp.Domain.Protocol.PaginationTest34import Std.Io as Io5import Std.Json as Json6import Std.Test as Test7import PuduLangMcp.Constants.Protocol as Protocol8import PuduLangMcp.Domain.Protocol.Pagination as Pagination9import PuduLangMcp.Errors.RpcError as RpcError1011/// The code a failed page answers, or 0.12fn failureCode(outcome: &Result[(Array[Int], Option[Str]), RpcError.ProtocolError]) -> Int {13  match outcome {14    case Ok(_) => 015    case Err(problem) => RpcError.code(&problem)16  }17}1819/// Runs the suite.20fn main() -> Int {21  let items = [1, 2, 3, 4, 5]22  let checks = Test.suite("Domain.Protocol.Pagination", &[23      Test.equals("no cursor starts at the beginning", &Pagination.page(&items, &None, 2), &Ok(([1, 2], Some("offset:2")))),24      Test.equals("a cursor continues where the last page stopped", &Pagination.page(&items, &Some("offset:2"), 2), &Ok(([3, 4], Some("offset:4")))),25      Test.equals("the last page has no next cursor", &Pagination.page(&items, &Some("offset:4"), 2), &Ok(([5], None))),26      Test.equals("a page that fits has no next cursor", &Pagination.page(&items, &None, 5), &Ok(([1, 2, 3, 4, 5], None))),27      Test.equals("an empty list is one empty page", &Pagination.page(&[], &None, 3), &Ok(([], None))),28      Test.equals("a cursor at the end is invalid", &failureCode(&Pagination.page(&items, &Some("offset:5"), 2)), &Protocol.INVALID_PARAMS),29      Test.equals("a cursor past the end is invalid", &failureCode(&Pagination.page(&items, &Some("offset:99"), 2)), &Protocol.INVALID_PARAMS),30      Test.equals("a negative offset is invalid", &failureCode(&Pagination.page(&items, &Some("offset:-1"), 2)), &Protocol.INVALID_PARAMS),31      Test.equals("a foreign cursor is invalid", &failureCode(&Pagination.page(&items, &Some("eyJwYWdlIjogM30="), 2)), &Protocol.INVALID_PARAMS),32      Test.equals("a cursor without digits is invalid", &failureCode(&Pagination.page(&items, &Some("offset:"), 2)), &Protocol.INVALID_PARAMS),33      Test.equals("a cursor with trailing text is invalid", &failureCode(&Pagination.page(&items, &Some("offset:1x"), 2)), &Protocol.INVALID_PARAMS),34      Test.equals("no cursor parameter reads as none", &Pagination.cursorOf(&Json.object(&[])), &Ok(None)),35      Test.equals("a string cursor is read", &Pagination.cursorOf(&Json.object(&[("cursor", Json.Text("offset:1"))])), &Ok(Some("offset:1"))),36      Test.that("a non-string cursor is invalid params", Pagination.cursorOf(&Json.object(&[("cursor", Json.Number(1))])) == Err(RpcError.InvalidParams("cursor must be a string")))37    ])38  let ran = Test.run(&checks)39  for failure in Test.failuresOf(&ran) {40    let _reported = Io.writeErrorLine(failure)41  }42  Test.report(&ran)43}44