package cc.unitmesh.e2e.dsl
import cc.unitmesh.agent.webagent.model.*
import kotlinx.serialization.Serializable
/**
* E2E Test DSL - A human-readable domain-specific language for E2E testing.
*
* DSL Syntax Example:
* ```
* scenario "User Login Test" {
* description "Verify user can login with valid credentials"
* url "https://example.com/login"
* tags ["login", "auth"]
* priority high
*
* step "Enter username" {
* type #1 "testuser"
* }
*
* step "Enter password" {
* type #2 "password123" clearFirst pressEnter
* }
*
* step "Click login button" {
* click #3
* expect "Dashboard should appear"
* }
*
* step "Verify login success" {
* assert #4 visible
* assert #5 textContains "Welcome"
* }
* }
* ```
*
* Action Keywords:
* - click #id [left|right|middle] [double]
* - type #id "text" [clearFirst] [pressEnter]
* - hover #id
* - scroll up|down|left|right [amount] [#id]
* - wait duration|visible|hidden|enabled|textPresent|urlContains|pageLoaded|networkIdle [value] [timeout]
* - pressKey "key" [ctrl] [alt] [shift] [meta]
* - navigate "url"
* - goBack
* - goForward
* - refresh
* - assert #id visible|hidden|enabled|disabled|checked|unchecked|textEquals|textContains|attributeEquals|hasClass [value]
* - select #id [value "v"] [label "l"] [index n]
* - uploadFile #id "path"
* - screenshot "name" [fullPage]
*
* @see Issue #532
*/
object E2EDsl {
const val VERSION = "1.0.0"
/**
* DSL keywords
*/
object Keywords {
const val SCENARIO = "scenario"
const val DESCRIPTION = "description"
const val URL = "url"
const val TAGS = "tags"
const val PRIORITY = "priority"
const val STEP = "step"
const val EXPECT = "expect"
const val TIMEOUT = "timeout"
const val RETRY = "retry"
const val CONTINUE_ON_FAILURE = "continueOnFailure"
// Actions
const val CLICK = "click"
const val TYPE = "type"
const val HOVER = "hover"
const val SCROLL = "scroll"
const val WAIT = "wait"
const val PRESS_KEY = "pressKey"
const val NAVIGATE = "navigate"
const val GO_BACK = "goBack"
const val GO_FORWARD = "goForward"
const val REFRESH = "refresh"
const val ASSERT = "assert"
const val SELECT = "select"
const val UPLOAD_FILE = "uploadFile"
const val SCREENSHOT = "screenshot"
// Modifiers
const val CLEAR_FIRST = "clearFirst"
const val PRESS_ENTER = "pressEnter"
const val FULL_PAGE = "fullPage"
const val DOUBLE = "double"
// Mouse buttons
const val LEFT = "left"
const val RIGHT = "right"
const val MIDDLE = "middle"
// Scroll directions
const val UP = "up"
const val DOWN = "down"
// Key modifiers
const val CTRL = "ctrl"
const val ALT = "alt"
const val SHIFT = "shift"
const val META = "meta"
// Wait conditions
const val DURATION = "duration"
const val VISIBLE = "visible"
const val HIDDEN = "hidden"
const val ENABLED = "enabled"
const val DISABLED = "disabled"
const val TEXT_PRESENT = "textPresent"
const val URL_CONTAINS = "urlContains"
const val PAGE_LOADED = "pageLoaded"
const val NETWORK_IDLE = "networkIdle"
// Assertion types
const val CHECKED = "checked"
const val UNCHECKED = "unchecked"
const val TEXT_EQUALS = "textEquals"
const val TEXT_CONTAINS = "textContains"
const val ATTRIBUTE_EQUALS = "attributeEquals"
const val HAS_CLASS = "hasClass"
// Priority levels
const val HIGH = "high"
const val MEDIUM = "medium"
const val LOW = "low"
const val CRITICAL = "critical"
// Select options
const val VALUE = "value"
const val LABEL = "label"
const val INDEX = "index"
}
}
/**
* Result of parsing E2E DSL
*/
@Serializable
data class DslParseResult(
val success: Boolean,
val scenario: TestScenario? = null,
val errors: List = emptyList(),
val warnings: List = emptyList()
)
/**
* DSL parsing error
*/
@Serializable
data class DslError(
val line: Int,
val column: Int,
val message: String,
val context: String? = null
)