pk_data_mapper_test.dart 2.89 KB
import 'package:doublefeel_flutter/app/modules/pk/models/pk_data.dart';
import 'package:doublefeel_flutter/app/modules/pk/models/pk_data_mapper.dart';
import 'package:doublefeel_flutter/data/models/health/health_models.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  const partner = PkPlayer(name: '好友', steps: 12);
  const self = PkPlayer(name: '我', steps: 34);
  final now = DateTime(2026, 9, 11);
  PkData map(PkCurrentMonthData data) =>
      mapPartnerPkData(data, partner: partner, self: self, now: now);

  test(
    'API partner is left, user is right; today and month can have different winners',
    () {
      final result = map(
        const PkCurrentMonthData(
          userWinAmount: 8,
          partnerWinAmount: 2,
          todayRecord: PkRecord(
            date: 20260911,
            partnerScore: 800,
            userScore: 200,
            partnerSteps: 100,
            userSteps: 50,
            partnerMove: 80,
            userMove: 40,
            partnerStand: 5,
            userStand: 3,
          ),
        ),
      );
      expect(result.result, PkResult.win);
      expect(result.monthlyResult, PkResult.loss);
      expect(result.left.steps, 100);
      expect(result.right.calories, 40);
      expect(result.left.standingHours, 5);
      expect(result.days[11]?.leftFraction, .8);
    },
  );
  test('missing scores stay missing while valid zeroes produce a draw', () {
    expect(map(const PkCurrentMonthData()).result, isNull);
    final result = map(
      const PkCurrentMonthData(
        todayRecord: PkRecord(partnerScore: 0, userScore: 0),
      ),
    );
    expect(result.result, PkResult.draw);
    expect(result.left.steps, 12);
    expect(result.days[11]?.leftFraction, .5);
  });
  test(
    'calendar rejects previous months, future dates and incomplete scores',
    () {
      final result = map(
        const PkCurrentMonthData(
          monthRecordList: [
            PkRecord(date: 20260810, partnerScore: 1, userScore: 2),
            PkRecord(date: 20260912, partnerScore: 1, userScore: 2),
            PkRecord(date: 20260909, partnerScore: 1),
            PkRecord(date: 20260910, partnerScore: 1, userScore: 2),
          ],
        ),
      );
      expect(result.days.keys, [10]);
    },
  );
  test('stale today record cannot become todays score', () {
    final result = map(
      const PkCurrentMonthData(
        todayRecord: PkRecord(
          date: 20260910,
          partnerScore: 800,
          userScore: 200,
        ),
      ),
    );
    expect(result.result, isNull);
    expect(result.days, isEmpty);
  });
  test('parses seconds, milliseconds and yyyyMMdd; rejects invalid dates', () {
    expect(pkRecordDate(now.millisecondsSinceEpoch ~/ 1000), now);
    expect(pkRecordDate(now.millisecondsSinceEpoch), now);
    expect(pkRecordDate(20260911), now);
    expect(pkRecordDate(20260230), isNull);
    expect(pkRecordDate(0), isNull);
  });
}