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:
committed by
GitHub
parent
90f2998088
commit
fc35476503
@ -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";
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
47
lib/widgets/progress_list_view/progress_list_tile.dart
Normal file
47
lib/widgets/progress_list_view/progress_list_tile.dart
Normal 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),
|
||||
);
|
||||
}
|
||||
}
|
33
lib/widgets/progress_list_view/progress_list_view.dart
Normal file
33
lib/widgets/progress_list_view/progress_list_view.dart
Normal 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(),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user