<think>
Okay, I need to implement two functions, dur_hours and dur_text, based on the given specifications. Let me start by understanding what each function is supposed to do.

First, dur_hours takes an integer number of minutes and returns the whole hours, discarding the remaining minutes. So, for example, if the input is 125 minutes, that's 2 hours and 5 minutes. The function should return 2. So the calculation is just integer division of minutes by 60. But wait, what if the input is negative? The problem says nothing about handling negative values, but the contract says to raise ValueError for invalid arguments. But the problem says that the function should return the whole hours, so maybe negative minutes are allowed? Wait, the problem says that the input is a count of minutes, so maybe it's supposed to be non-negative. But the contract says that if the input is invalid, like a negative number, we should raise ValueError. Wait, the problem says that the function should return the whole hours, but if the input is negative, how to handle that? The problem says that the count of minutes below zero should be written with a sign? But the problem says that the user hasn't specified whether negative counts should be handled with signs. So maybe the functions should only accept non-negative integers. But the problem says that the functions should raise ValueError for invalid arguments. So, for example, if minutes is negative, we should raise ValueError. So in the code, I need to check if minutes is negative and raise an error.

So for dur_hours, the code would be: if minutes is negative, raise ValueError. Otherwise, return minutes // 60.

Now for dur_text. The function needs to convert the minutes into a string like "1h30m". If the minutes are a whole number of hours, then the minutes part is dropped. If the minutes are less than an hour, then the hours part is dropped. Also, zero is 0m. So, for example, 0 minutes becomes "0m", 30 minutes becomes "30m", 125 minutes becomes "2h30m", 60 minutes becomes "1h0m", 65 minutes becomes "1h5m".

Wait, but the problem says that a whole number of hours drops the minutes. So if the minutes is exactly divisible by 60, then the minutes part is zero. So for 120 minutes, it's 2 hours, so the output is "2h0m"? Or does it drop the minutes part? Wait the problem says, "a whole number of hours drops the minutes, a count under an hour drops the hours". So, for example, if the minutes is 120, which is 2 hours, then the output is "2h". Because the minutes part is zero. But the problem says that a whole number of hours drops the minutes. So, the function should output "2h" in that case. But the example given in the problem says that 1h30m is the format. So, perhaps the function should output the hours and minutes parts, but if one of them is zero, it's omitted. Wait, the problem says that a whole number of hours drops the minutes. So, for 120 minutes, which is 2 hours, the output is "2h". Similarly, if the minutes is 30, which is less than an hour, then the output is "30m". But if the minutes is 65, then it's 1h5m.

So, the steps for dur_text are:

1. Check if minutes is negative. If so, raise