import 'package:flutter_test/flutter_test.dart'; import 'package:patbond_flutter/core/models/patch_field.dart'; /// PATCH 三态的 JSON 表现(契约 v1.4.0 的 `UpdateMeRequest` / /// `UpdatePetRequest.avatarAssetId`)。 /// /// 本文件守住的红线只有一条:**absent 绝不落键**。若 absent 落成 `null`, /// 用户「只改昵称」会把头像一起清掉(服务端把显式 null 当清空指令)。 void main() { test('absent 不落键 / clear 落 null / value 落值', () { final json = {}; const PatchField.absent().writeTo(json, 'a'); expect(json.containsKey('a'), isFalse, reason: 'absent 必须连键都不出现'); const PatchField.clear().writeTo(json, 'b'); expect(json.containsKey('b'), isTrue); expect(json['b'], isNull); const PatchField.value('x').writeTo(json, 'c'); expect(json['c'], 'x'); }); test('absent 与 clear 的 valueOrNull 同为 null,只能靠 isPresent 区分', () { const absent = PatchField.absent(); const clear = PatchField.clear(); expect(absent.valueOrNull, isNull); expect(clear.valueOrNull, isNull); expect(absent.isPresent, isFalse); expect(clear.isPresent, isTrue); expect(absent.isClear, isFalse); expect(clear.isClear, isTrue); expect(const PatchField.value('x').isClear, isFalse); }); test('encode 只作用于有值态(clear 不调 encode,避免 null 解引用)', () { final json = {}; var encodeCalls = 0; const PatchField.clear().writeTo( json, 'n', encode: (value) { encodeCalls += 1; return value.toString(); }, ); expect(json['n'], isNull); expect(encodeCalls, 0); const PatchField.value(7).writeTo( json, 'm', encode: (value) { encodeCalls += 1; return value.toString(); }, ); expect(json['m'], '7'); expect(encodeCalls, 1); }); test('值相等即相等(absent 与 clear 不相等)', () { expect( const PatchField.value('a'), const PatchField.value('a'), ); expect( const PatchField.absent(), isNot(const PatchField.clear()), ); }); }