|
2 | 2 |
|
3 | 3 | namespace SilverStripe\Forms\Tests; |
4 | 4 |
|
| 5 | +use PHPUnit\Framework\Attributes\DataProvider; |
5 | 6 | use SilverStripe\Forms\Tests\ListboxFieldTest\Article; |
6 | 7 | use SilverStripe\Forms\Tests\ListboxFieldTest\Tag; |
7 | 8 | use SilverStripe\Forms\Tests\ListboxFieldTest\TestObject; |
@@ -120,6 +121,60 @@ public function testSaveIntoMultiple() |
120 | 121 | $this->assertEquals('["a","c"]', $obj2->Choices); |
121 | 122 | } |
122 | 123 |
|
| 124 | + public static function provideSaveIntoValueScenarios(): array |
| 125 | + { |
| 126 | + return [ |
| 127 | + 'mixed-values' => [ |
| 128 | + 'input' => [null, 0, false, '123', -123, '', '0', 'ABC123'], |
| 129 | + 'expected' => [null, 0, false, '123', -123, '', '0', 'ABC123'], |
| 130 | + ], |
| 131 | + 'string-values' => [ |
| 132 | + 'input' => ['123', '0', '-123', '', 'ABC123'], |
| 133 | + 'expected' => ['123', '0', '-123', '', 'ABC123'], |
| 134 | + ], |
| 135 | + 'integer-values' => [ |
| 136 | + 'input' => [0, 123, -123], |
| 137 | + 'expected' => [0, 123, -123], |
| 138 | + ], |
| 139 | + 'boolean-values' => [ |
| 140 | + 'input' => [false, true], |
| 141 | + 'expected' => [false, true], |
| 142 | + ], |
| 143 | + 'null-only' => [ |
| 144 | + 'input' => [null], |
| 145 | + 'expected' => [null], |
| 146 | + ], |
| 147 | + 'scalar-zero' => [ |
| 148 | + 'input' => 0, |
| 149 | + 'expected' => [0], |
| 150 | + ], |
| 151 | + 'scalar-string-zero' => [ |
| 152 | + 'input' => '0', |
| 153 | + 'expected' => ['0'], |
| 154 | + ], |
| 155 | + ]; |
| 156 | + } |
| 157 | + |
| 158 | + /** |
| 159 | + * @dataProvider provideSaveIntoValueScenarios |
| 160 | + */ |
| 161 | + public function testSaveIntoPreservesValueTypes(mixed $input, array $expected): void |
| 162 | + { |
| 163 | + $choices = [ |
| 164 | + '' => 'Empty string', |
| 165 | + 0 => 'Zero', |
| 166 | + '123' => 'String integer', |
| 167 | + -123 => 'Negative integer', |
| 168 | + 'ABC123' => 'Alpha-numeric string', |
| 169 | + 'false' => 'False string', |
| 170 | + ]; |
| 171 | + $field = new ListboxField('Choices', 'Choices', $choices); |
| 172 | + $obj = new TestObject(); |
| 173 | + $field->setValue($input); |
| 174 | + $field->saveInto($obj); |
| 175 | + $this->assertSame($expected, json_decode($obj->Choices, true)); |
| 176 | + } |
| 177 | + |
123 | 178 | public function testSaveIntoManyManyRelation() |
124 | 179 | { |
125 | 180 | $article = $this->objFromFixture(Article::class, 'articlewithouttags'); |
|
0 commit comments