Parse and validate AT Protocol Lexicons with DTO generation for Laravel
1<?php
2
3namespace SocialDept\AtpSchema\Tests\Unit\Validation\Rules;
4
5use Orchestra\Testbench\TestCase;
6use SocialDept\AtpSchema\Validation\Rules\Language;
7
8class LanguageTest extends TestCase
9{
10 protected Language $rule;
11
12 protected function setUp(): void
13 {
14 parent::setUp();
15
16 $this->rule = new Language();
17 }
18
19 public function test_it_validates_simple_language_code(): void
20 {
21 $valid = 'en';
22
23 $failed = false;
24 $this->rule->validate('language', $valid, function () use (&$failed) {
25 $failed = true;
26 });
27
28 $this->assertFalse($failed);
29 }
30
31 public function test_it_validates_language_with_region(): void
32 {
33 $valid = 'en-US';
34
35 $failed = false;
36 $this->rule->validate('language', $valid, function () use (&$failed) {
37 $failed = true;
38 });
39
40 $this->assertFalse($failed);
41 }
42
43 public function test_it_validates_language_with_script(): void
44 {
45 $valid = 'zh-Hans';
46
47 $failed = false;
48 $this->rule->validate('language', $valid, function () use (&$failed) {
49 $failed = true;
50 });
51
52 $this->assertFalse($failed);
53 }
54
55 public function test_it_validates_complex_language_tags(): void
56 {
57 $validLanguages = [
58 'en',
59 'en-US',
60 'zh-Hans',
61 'zh-Hans-CN',
62 'en-GB',
63 'es-419',
64 'fr-CA',
65 ];
66
67 foreach ($validLanguages as $language) {
68 $failed = false;
69 $this->rule->validate('language', $language, function () use (&$failed) {
70 $failed = true;
71 });
72
73 $this->assertFalse($failed, "Expected {$language} to be valid");
74 }
75 }
76
77 public function test_it_rejects_invalid_language_code(): void
78 {
79 $invalid = 'not-a-language-123';
80
81 $failed = false;
82 $this->rule->validate('language', $invalid, function () use (&$failed) {
83 $failed = true;
84 });
85
86 $this->assertTrue($failed);
87 }
88
89 public function test_it_rejects_too_short_code(): void
90 {
91 $invalid = 'e';
92
93 $failed = false;
94 $this->rule->validate('language', $invalid, function () use (&$failed) {
95 $failed = true;
96 });
97
98 $this->assertTrue($failed);
99 }
100
101 public function test_it_rejects_non_string(): void
102 {
103 $failed = false;
104 $this->rule->validate('language', 123, function () use (&$failed) {
105 $failed = true;
106 });
107
108 $this->assertTrue($failed);
109 }
110}