1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6namespace Tests\Models\Multiplayer;
7
8use App\Exceptions\InvariantException;
9use App\Models\Beatmap;
10use App\Models\Multiplayer\PlaylistItem;
11use App\Models\Multiplayer\Room;
12use App\Models\User;
13use Tests\TestCase;
14
15class PlaylistItemTest extends TestCase
16{
17 public static function rulesetsProvider()
18 {
19 return [
20 'osu' => [0],
21 'taiko' => [1],
22 'fruits' => [2],
23 'mania' => [3],
24 ];
25 }
26
27 /**
28 * @dataProvider rulesetsProvider
29 */
30 public function testOsuBeatmapPlayableInAnyRuleset(int $rulesetId)
31 {
32 $beatmap = Beatmap::factory()->create([
33 'playmode' => 0,
34 ]);
35 $room = Room::factory()->create();
36 $user = User::factory()->create();
37 $playlistItem = new PlaylistItem([
38 'beatmap_id' => $beatmap->getKey(),
39 'ruleset_id' => $rulesetId,
40 'room_id' => $room->getKey(),
41 'owner_id' => $user->getKey(),
42 'required_mods' => [],
43 'allowed_mods' => [],
44 ]);
45
46 $this->expectNotToPerformAssertions();
47 $playlistItem->save();
48 }
49
50 public function testCatchBeatmapPlayableInCatchRuleset()
51 {
52 $beatmap = Beatmap::factory()->create([
53 'playmode' => 2,
54 ]);
55 $room = Room::factory()->create();
56 $user = User::factory()->create();
57 $playlistItem = new PlaylistItem([
58 'beatmap_id' => $beatmap->getKey(),
59 'ruleset_id' => 2,
60 'room_id' => $room->getKey(),
61 'owner_id' => $user->getKey(),
62 'required_mods' => [],
63 'allowed_mods' => [],
64 ]);
65
66 $this->expectNotToPerformAssertions();
67 $playlistItem->save();
68 }
69
70 public function testManiaBeatmapNotPlayableInOtherRulesets()
71 {
72 $beatmap = Beatmap::factory()->create([
73 'playmode' => 3,
74 ]);
75 $room = Room::factory()->create();
76 $user = User::factory()->create();
77 $playlistItem = new PlaylistItem([
78 'beatmap_id' => $beatmap->getKey(),
79 'ruleset_id' => 2,
80 'room_id' => $room->getKey(),
81 'owner_id' => $user->getKey(),
82 'required_mods' => [],
83 'allowed_mods' => [],
84 ]);
85
86 $this->expectException(InvariantException::class);
87 $this->expectExceptionMessageMatches('/^invalid ruleset_id for beatmap \d+$/');
88 $playlistItem->save();
89 }
90}