Files
klubhaus-doorbell/libraries/FastLED/tests/test_ui_help.cpp
2026-02-12 00:45:31 -08:00

195 lines
5.3 KiB
C++

#include "test.h"
#include "fl/json.h"
#include "fl/namespace.h"
#if FASTLED_ENABLE_JSON
#include "platforms/shared/ui/json/ui_internal.h"
#include "platforms/shared/ui/json/ui_manager.h"
#include "platforms/shared/ui/json/help.h"
#include "fl/ui.h"
FASTLED_USING_NAMESPACE
TEST_CASE("JsonHelpImpl basic functionality") {
fl::string markdownContent = "# Test Help\n\nThis is a **test** help text with *emphasis* and `code`.";
JsonHelpImpl help(markdownContent);
CHECK(help.name() == "help");
CHECK(help.markdownContent() == markdownContent);
CHECK(help.groupName().empty());
// Test group functionality
fl::string groupName = "documentation";
help.Group(groupName);
CHECK(help.groupName() == groupName);
}
TEST_CASE("JsonHelpImpl JSON serialization") {
fl::string markdownContent = R"(# FastLED Help
## Getting Started
To use FastLED, you need to:
1. **Include** the library: `#include <FastLED.h>`
2. **Define** your LED array: `CRGB leds[NUM_LEDS];`
3. **Initialize** in setup(): `FastLED.addLeds<LED_TYPE, DATA_PIN>(leds, NUM_LEDS);`
### Advanced Features
- Use [color palettes](https://github.com/FastLED/FastLED/wiki/Colorpalettes)
- Apply *color correction*
- Implement **smooth animations**
```cpp
// Example code
void rainbow() {
fill_rainbow(leds, NUM_LEDS, gHue, 7);
FastLED.show();
}
```
Visit our [documentation](https://fastled.io) for more details!)";
JsonHelpImpl help(markdownContent);
help.Group("getting-started");
fl::Json jsonObj = fl::Json::createObject();
help.toJson(jsonObj);
fl::string name = jsonObj["name"].as_or(fl::string(""));
CHECK(name == fl::string("help"));
fl::string type = jsonObj["type"].as_or(fl::string(""));
CHECK(type == fl::string("help"));
fl::string group = jsonObj["group"].as_or(fl::string(""));
CHECK(group == fl::string("getting-started"));
int id = jsonObj["id"].as_or(-1);
CHECK(id >= 0);
fl::string content = jsonObj["markdownContent"].as_or(fl::string(""));
CHECK(content == markdownContent);
// Also test that operator| still works
fl::string name2 = jsonObj["name"] | fl::string("");
CHECK(name2 == fl::string("help"));
}
TEST_CASE("UIHelp wrapper functionality") {
fl::string markdownContent = "## Quick Reference\n\n- Use `CRGB` for colors\n- Call `FastLED.show()` to update LEDs";
UIHelp help(markdownContent.c_str());
// Test markdown content access
CHECK(help.markdownContent() == markdownContent);
// Test group setting
fl::string groupName = "reference";
help.setGroup(groupName);
CHECK(help.hasGroup());
}
TEST_CASE("UIHelp with complex markdown") {
fl::string complexMarkdown = R"(# Complex Markdown Test
## Headers and Formatting
This tests **bold text**, *italic text*, and `inline code`.
### Lists
Unordered list:
- Item 1
- Item 2
- Item 3
Ordered list:
1. First item
2. Second item
3. Third item
### Links and Code Blocks
Check out [FastLED GitHub](https://github.com/FastLED/FastLED) for source code.
```cpp
// Example code
void rainbow() {
fill_rainbow(leds, NUM_LEDS, gHue, 7);
FastLED.show();
}
```
Testing special characters: < > & " '
And some Unicode: )";
JsonHelpImpl help(complexMarkdown);
fl::Json jsonObj = fl::Json::createObject();
help.toJson(jsonObj);
// Verify the markdown content is preserved exactly
fl::string content = jsonObj["markdownContent"].as_or(fl::string(""));
CHECK(content == complexMarkdown);
fl::string type = jsonObj["type"].as_or(fl::string(""));
CHECK(type == fl::string("help"));
// Also test operator|
fl::string content2 = jsonObj["markdownContent"] | fl::string("");
CHECK(content2 == complexMarkdown);
}
TEST_CASE("UIHelp edge cases") {
// Test with empty markdown
JsonHelpImpl emptyHelp("");
CHECK(emptyHelp.markdownContent() == "");
// Test with markdown containing only whitespace
JsonHelpImpl whitespaceHelp(" \n\t \n ");
CHECK(whitespaceHelp.markdownContent() == " \n\t \n ");
// Test with very long markdown content
fl::string longContent;
for (int i = 0; i < 100; i++) {
longContent += "This is line ";
longContent += i;
longContent += " of a very long help text.\n";
}
JsonHelpImpl longHelp(longContent);
CHECK(longHelp.markdownContent() == longContent);
// Verify JSON serialization works with long content
fl::Json jsonObj = fl::Json::createObject();
longHelp.toJson(jsonObj);
fl::string content = jsonObj["markdownContent"].as_or(fl::string(""));
CHECK(content == longContent);
// Also test operator|
fl::string content2 = jsonObj["markdownContent"] | fl::string("");
CHECK(content2 == longContent);
}
TEST_CASE("UIHelp group operations") {
JsonHelpImpl help("Test content");
// Test initial state
CHECK(help.groupName().empty());
// Test setting group via Group() method
help.Group("group1");
CHECK(help.groupName() == "group1");
// Test setting group via setGroup() method
help.setGroup("group2");
CHECK(help.groupName() == "group2");
// Test setting empty group
help.setGroup("");
CHECK(help.groupName().empty());
}
#endif // FASTLED_ENABLE_JSON