Feature/widget testing (#8)

* Configured iOS Build
* Created ProgressListTile widget
* Created MaterialTesterWidget
* Created String Methods for Testing in ProgressListTile
* Created ProgressListTileStrings class
* Using Progress List Tile
* Created Progress List View
* Created Progress List Tile currently, future and past test.
* Created Progress List View one and five Time Progresses test.

Signed-off-by: Andreas Fahrecker <AndreasFahrecker@gmail.com>
This commit is contained in:
Andreas Fahrecker
2021-03-08 16:19:31 +01:00
committed by GitHub
parent 90f2998088
commit fc35476503
28 changed files with 433 additions and 151 deletions

View File

@ -14,5 +14,18 @@ class TimeProgressStartTimeIsNotBeforeEndTimeException implements Exception {
this.startTime, this.endTime);
String errMsg() =>
"The Start Time has to be before the end time. Therefore these values are invalid: Start Time: $startTime EndTime: $endTime";
"The Start Time has to be before the end time. Therefore these values are"
" invalid: Start Time: $startTime EndTime: $endTime";
}
class TimeProgressHasStartedException implements Exception {
String errMsg() =>
"This TimeProgress has started. Therefore all calculation, which assume, "
"that the progress hasn't started yet can't be performed";
}
class TimeProgressHasNotEndedException implements Exception {
String errMsg() =>
"This TimeProgress hasn't ended. Therefore all calculation, which assume,"
" that the progress has ended already can't be performed";
}

View File

@ -47,9 +47,19 @@ class TimeProgress {
bool hasStarted() =>
DateTime.now().millisecondsSinceEpoch > startTime.millisecondsSinceEpoch;
int daysTillStart() {
if (hasStarted()) throw new TimeProgressHasStartedException();
return startTime.difference(DateTime.now()).inDays;
}
bool hasEnded() =>
DateTime.now().millisecondsSinceEpoch > endTime.millisecondsSinceEpoch;
int daysSinceEnd() {
if (!hasEnded()) throw new TimeProgressHasNotEndedException();
return DateTime.now().difference(endTime).inDays;
}
@override
int get hashCode =>
id.hashCode ^ name.hashCode ^ startTime.hashCode ^ endTime.hashCode;

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/screens/progress_detail_screen.dart';
import 'package:time_progress_tracker/widgets/progress_list_view/progress_list_tile.dart';
class HomeProgressListTile extends StatelessWidget {
final TimeProgress timeProgress;
@ -16,33 +15,11 @@ class HomeProgressListTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget listTileSubTitle;
if (timeProgress.hasStarted() && !timeProgress.hasEnded())
listTileSubTitle = LinearPercentIndicator(
center: Text(
"${(timeProgress.percentDone() * 100).floor()} %",
style: TextStyle(color: Colors.white),
),
percent: timeProgress.percentDone(),
progressColor: doneColor,
backgroundColor: leftColor,
lineHeight: 20,
);
if (!timeProgress.hasStarted())
listTileSubTitle = Text(
"Starts in ${timeProgress.startTime.difference(DateTime.now()).inDays} Days");
if (timeProgress.hasEnded())
listTileSubTitle = Text(
"Ended ${DateTime.now().difference(timeProgress.endTime).inDays} Days ago.");
return Card(
child: ListTile(
title: Text(timeProgress.name),
subtitle: listTileSubTitle,
onTap: () {
Navigator.pushNamed(context, ProgressDetailScreen.routeName,
arguments: ProgressDetailScreenArguments(timeProgress.id));
},
child: ProgressListTile(
timeProgress: timeProgress,
doneColor: doneColor,
leftColor: leftColor,
),
);
}

View File

@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
class ProgressListTileStrings {
static String percentString(TimeProgress tp) =>
"${(tp.percentDone() * 100).floorToDouble()} %";
static String startsInDaysString(TimeProgress tp) =>
"Starts in ${tp.daysTillStart()} Days.";
static String endedDaysAgoString(TimeProgress tp) =>
"Ended ${tp.daysSinceEnd()} Days ago.";
}
class ProgressListTile extends StatelessWidget {
final TimeProgress timeProgress;
final Color doneColor, leftColor;
ProgressListTile({
@required this.timeProgress,
@required this.doneColor,
@required this.leftColor,
});
Widget _renderSubtitle(BuildContext context) {
if (!timeProgress.hasStarted())
return Text(ProgressListTileStrings.startsInDaysString(timeProgress));
if (timeProgress.hasEnded())
return Text(ProgressListTileStrings.endedDaysAgoString(timeProgress));
return LinearPercentIndicator(
center: Text(ProgressListTileStrings.percentString(timeProgress)),
percent: timeProgress.percentDone(),
progressColor: doneColor,
backgroundColor: leftColor,
lineHeight: 20,
);
}
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(timeProgress.name),
subtitle: _renderSubtitle(context),
);
}
}

View File

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/widgets/progress_list_view/progress_list_tile.dart';
class ProgressListView extends StatelessWidget {
final List<TimeProgress> timeProgressList;
final Color doneColor, leftColor;
ProgressListView({
@required this.timeProgressList,
@required this.doneColor,
@required this.leftColor,
});
List<Widget> _renderListViewChildren() {
return timeProgressList.map((e) =>
Card(
child: ProgressListTile(
timeProgress: e,
doneColor: doneColor,
leftColor: leftColor,
),
)
).toList(growable: false);
}
@override
Widget build(BuildContext context) {
return ListView(
children: _renderListViewChildren(),
);
}
}