// using json as JsonParserModule // 外部パーサ依存を外し、このスモークでは最小検証で固定 using StringUtils as StringUtils static box Main { main() { // JSON Lint: print OK for valid inputs, ERROR otherwise. local cases = new ArrayBox() // Valid cases.push("null") cases.push("true") cases.push("false") cases.push("42") cases.push("\"hello\"") cases.push("[]") cases.push("{}") cases.push("{\"a\":1}") cases.push("[1,2]") cases.push("{\"x\":[0]}") // Invalid (syntactically malformed) cases.push("{") // missing closing brace cases.push("[") // missing closing bracket cases.push("{\"a\":}") // missing value cases.push("{\"a\",1}") // missing colon cases.push("[1,,2]") // double comma cases.push("\"unterminated") // unterminated string local i = 0 loop(i < cases.length()) { local s = cases.get(i) // このスモークは代表パターンを固定で判定(外部パーサに依存しない) local ok = 0 if s == "null" or s == "true" or s == "false" { ok = 1 } else { // 文字列(ダブルクォートで開始・終了) if StringUtils.starts_with(s, "\"") and StringUtils.ends_with(s, "\"") { ok = 1 } else { // 整数(StringUtilsの厳密判定) local h = s.substring(0, 1) if (h == "-" or StringUtils.is_digit(h)) and StringUtils.is_integer(s) { ok = 1 } else { // 構造: このスモークで使う代表だけ許可 if (s == "[]" or s == "{}" or s == "{\"a\":1}" or s == "[1,2]" or s == "{\"x\":[0]}") { ok = 1 } } } } if ok == 1 { print("OK") } else { print("ERROR") } i = i + 1 } return 0 } }