import 'package:rimworld_modman/mod.dart'; import 'package:rimworld_modman/mod_list.dart'; import 'package:test/test.dart'; Mod makeDummy() { return Mod( name: 'Dummy Mod', id: 'dummy', path: '', versions: ["1.5"], description: '', dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], size: 0, isBaseGame: false, isExpansion: false, enabled: false, ); } void main() { test('Mods should be sorted by size while respecting constraints', () { final list = ModList(); list.mods = { 'dubwise.rimatomics': makeDummy().copyWith( id: 'dubwise.rimatomics', name: 'Dubs Rimatomics', enabled: true, size: 1563, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'brrainz.justignoremepassing': makeDummy().copyWith( id: 'brrainz.justignoremepassing', name: 'Just Ignore Me Passing', enabled: true, size: 28, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'brrainz.harmony': makeDummy().copyWith( id: 'brrainz.harmony', name: 'Harmony', enabled: true, size: 17, dependencies: [], loadAfter: [], loadBefore: ['ludeon.rimworld'], incompatibilities: [], ), 'jecrell.doorsexpanded': makeDummy().copyWith( id: 'jecrell.doorsexpanded', name: 'Doors Expanded', enabled: true, size: 765, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'dubwise.rimefeller': makeDummy().copyWith( id: 'dubwise.rimefeller', name: 'Rimefeller', enabled: true, size: 744, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'neronix17.toolbox': makeDummy().copyWith( id: 'neronix17.toolbox', name: 'Tabula Rasa', enabled: true, size: 415, dependencies: [], loadAfter: [ 'brrainz.harmony', 'ludeon.rimworld', 'ludeon.rimworld.royalty', 'ludeon.rimworld.ideology', 'ludeon.rimworld.biotech', 'ludeon.rimworld.anomaly', 'unlimitedhugs.hugslib', 'erdelf.humanoidalienraces', ], loadBefore: [], incompatibilities: [], ), 'automatic.bionicicons': makeDummy().copyWith( id: 'automatic.bionicicons', name: 'Bionic icons', enabled: true, size: 365, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'lwm.deepstorage': makeDummy().copyWith( id: 'lwm.deepstorage', name: "LWM's Deep Storage", enabled: true, size: 256, dependencies: [], loadAfter: [ 'brrainz.harmony', 'ludeon.rimworld.core', 'rimfridge.kv.rw', 'mlie.cannibalmeals', ], loadBefore: ['com.github.alandariva.moreplanning'], incompatibilities: [], ), 'dubwise.dubsmintmenus': makeDummy().copyWith( id: 'dubwise.dubsmintmenus', name: 'Dubs Mint Menus', enabled: true, size: 190, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'dubwise.dubsmintminimap': makeDummy().copyWith( id: 'dubwise.dubsmintminimap', name: 'Dubs Mint Minimap', enabled: true, size: 190, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], ), 'ludeon.rimworld': makeDummy().copyWith( id: 'ludeon.rimworld', name: 'RimWorld', enabled: true, size: 0, dependencies: [], loadAfter: [], loadBefore: [], incompatibilities: [], isBaseGame: true, ), 'ludeon.rimworld.royalty': makeDummy().copyWith( id: 'ludeon.rimworld.royalty', name: 'RimWorld Royalty', enabled: true, size: 0, dependencies: [], loadAfter: ['ludeon.rimworld'], loadBefore: [], incompatibilities: [], isExpansion: true, ), 'ludeon.rimworld.ideology': makeDummy().copyWith( id: 'ludeon.rimworld.ideology', name: 'RimWorld Ideology', enabled: true, size: 0, dependencies: [], loadAfter: ['ludeon.rimworld'], loadBefore: [], incompatibilities: [], isExpansion: true, ), 'ludeon.rimworld.biotech': makeDummy().copyWith( id: 'ludeon.rimworld.biotech', name: 'RimWorld Biotech', enabled: true, size: 0, dependencies: [], loadAfter: ['ludeon.rimworld'], loadBefore: [], incompatibilities: [], isExpansion: true, ), 'ludeon.rimworld.anomaly': makeDummy().copyWith( id: 'ludeon.rimworld.anomaly', name: 'RimWorld Anomaly', enabled: true, size: 0, dependencies: [], loadAfter: ['ludeon.rimworld'], loadBefore: [], incompatibilities: [], isExpansion: true, ), }; list.enableAll(); final result = list.generateLoadOrder(); final expected = [ 'brrainz.harmony', 'ludeon.rimworld', 'ludeon.rimworld.anomaly', 'ludeon.rimworld.biotech', 'ludeon.rimworld.ideology', 'ludeon.rimworld.royalty', 'dubwise.rimatomics', 'jecrell.doorsexpanded', 'dubwise.rimefeller', 'neronix17.toolbox', 'automatic.bionicicons', 'lwm.deepstorage', 'dubwise.dubsmintmenus', 'dubwise.dubsmintminimap', 'brrainz.justignoremepassing', ]; expect(result.errors, isEmpty); expect(result.loadOrder, equals(expected)); }); test('Prepatcher should load before Harmony', () { final list = ModList(); list.mods = { 'bs.betterlog': makeDummy().copyWith( id: 'bs.betterlog', name: 'Better Log - Fix your errors', enabled: true, size: 69, dependencies: [], loadAfter: [ 'brrainz.harmony', 'me.samboycoding.betterloading', 'zetrith.prepatcher', 'ludeon.rimworld', ], loadBefore: [ 'ludeon.rimworld.royalty', 'ludeon.rimworld.ideology', 'ludeon.rimworld.biotech', 'ludeon.rimworld.anomaly', 'bs.performance', 'unlimitedhugs.hugslib', ], incompatibilities: [], ), 'zetrith.prepatcher': makeDummy().copyWith( id: 'zetrith.prepatcher', name: 'Prepatcher', enabled: true, size: 21, loadBefore: ['ludeon.rimworld', 'brrainz.harmony'], ), 'brrainz.harmony': makeDummy().copyWith( id: 'brrainz.harmony', name: 'Harmony', enabled: true, size: 17, loadBefore: ['ludeon.rimworld'], ), 'ludeon.rimworld': makeDummy().copyWith( id: 'ludeon.rimworld', name: 'RimWorld', enabled: true, size: 0, isBaseGame: true, ), 'ludeon.rimworld.anomaly': makeDummy().copyWith( id: 'ludeon.rimworld.anomaly', name: 'RimWorld Anomaly', enabled: true, size: 0, loadAfter: ['ludeon.rimworld'], isExpansion: true, ), 'ludeon.rimworld.biotech': makeDummy().copyWith( id: 'ludeon.rimworld.biotech', name: 'RimWorld Biotech', enabled: true, size: 0, loadAfter: ['ludeon.rimworld'], isExpansion: true, ), 'ludeon.rimworld.ideology': makeDummy().copyWith( id: 'ludeon.rimworld.ideology', name: 'RimWorld Ideology', enabled: true, size: 0, loadAfter: ['ludeon.rimworld'], isExpansion: true, ), 'ludeon.rimworld.royalty': makeDummy().copyWith( id: 'ludeon.rimworld.royalty', name: 'RimWorld Royalty', enabled: true, size: 0, loadAfter: ['ludeon.rimworld'], isExpansion: true, ), }; list.enableAll(); final order = list.generateLoadOrder(); final expected = [ 'zetrith.prepatcher', 'brrainz.harmony', 'ludeon.rimworld', 'bs.betterlog', 'ludeon.rimworld.anomaly', 'ludeon.rimworld.biotech', 'ludeon.rimworld.ideology', 'ludeon.rimworld.royalty', ]; expect(order.loadOrder, equals(expected)); }); }